Chuẩn hóa Unicode tên file: file trùng tên trên ổ chia sẻ
Nếu thư mục dùng chung hiện hai file cùng tên Nguyễn Văn Hùng - Ngân sách Q3.xlsx, trong đó một file không mở được, hoặc Windows tìm mãi không ra một file đang nằm sờ sờ trước mắt, thì bạn đang gặp lỗi chuẩn hóa Unicode tên file. Một đồng nghiệp dùng Mac đã lưu tên file có dấu tiếng Việt (hoặc chữ Hàn, chữ Nhật, chữ có dấu khác) ở dạng tổ hợp (NFD). Windows, phần lớn máy chủ Linux và nhiều dịch vụ web lại chờ dạng dựng sẵn (NFC). Hai tên nhìn giống hệt nhau trên màn hình nhưng là hai chuỗi byte khác nhau, nên ổ đĩa lưu cả hai cạnh nhau. Cách xử lý là đổi tên các file bị ảnh hưởng về NFC một lần, rồi thống nhất vài thói quen để chuyện này không lặp lại.
Vì sao chuẩn hóa Unicode tên file gây trùng lặp trên ổ chia sẻ
Unicode cho phép viết cùng một ký tự theo hai cách. Chữ é có thể là một mã duy nhất (U+00E9, dạng dựng sẵn hay NFC) hoặc là chữ e thường kèm theo một dấu sắc kết hợp phía sau (U+0065 U+0301, dạng tổ hợp hay NFD). Tiếng Việt bị nặng hơn nhiều ngôn ngữ khác vì rất nhiều chữ mang tới hai dấu: ệ trong "Việt" tách thành e + dấu mũ + dấu nặng, ố trong "Quốc" tách thành o + dấu mũ + dấu sắc, ữ trong "Hữu" tách thành u + dấu móc + dấu ngã. Chữ Hàn còn tách thành từng tự mẫu (한글 trong byte thô thành ㅎㅏㄴㄱㅡㄹ), chữ Nhật thì tách dakuten khỏi kana (が thành か + ゛).
macOS từ lâu lưu tên file ở dạng NFD, và nhiều ứng dụng Mac cùng Finder vẫn tạo tên theo cách đó. Windows gõ và lưu tên ở dạng NFC. Mỗi hệ điều hành đều hiển thị đúng dạng của bên kia, nên chẳng ai để ý cho đến khi hai file gặp nhau trên một ổ dùng chung:
- Ổ chia sẻ SMB và NAS (Synology, QNAP, máy chủ file Windows, Samba trên Linux). Hệ thống file lưu đúng chuỗi byte mà máy khách gửi tới. Máy Mac lưu bản NFD, sau đó người dùng Windows lưu bản NFC, và thế là có hai file. Không máy nào coi hai tên đó là một.
- Google Drive, Dropbox, OneDrive. Phần mềm đồng bộ trên máy tính so sánh tên giữa các máy. Tùy phần mềm và phiên bản, tên NFD từ Mac và tên NFC từ PC có thể bị xem là hai file khác nhau, sinh ra file "conflicted copy" hoặc một bản trùng lặp âm thầm. Tìm tên đó trên giao diện web có khi chỉ ra một trong hai.
- Zalo, Teams, email. File đính kèm giữ nguyên tên mà máy người gửi đặt. Người dùng Windows tải
Hợp đồng - Trần Thị Hồng.pdftừ đồng nghiệp dùng Mac sẽ có tên NFD trên ổ của mình. File mở bình thường, nhưng sau này gõ đúng tên đó vào ô tìm kiếm thì Windows không khớp. - Script, công cụ build và Git. Bất cứ thứ gì so sánh chuỗi theo từng byte đều thấy hai đường dẫn khác nhau. Git trên Mac có thể báo một file có dấu là bị xóa rồi thêm lại, hoặc không tìm thấy file mà đồng nghiệp dùng Windows đã commit.
Điểm quan trọng: không có gì bị hỏng. Mọi file đều nguyên vẹn. Chỉ có tên file là "bất đồng" về cách đánh vần cùng một chữ.
Cách nhận biết bản nào là bản NFD
Trước khi đổi tên, hãy xác nhận chẩn đoán. Mắt thường không phân biệt được, nên phải xem mã ký tự.
Trên Windows (PowerShell)
- Mở thư mục trong File Explorer, bấm vào thanh địa chỉ, gõ
powershellrồi nhấn Enter. - Chạy:
Get-ChildItem | ForEach-Object { "$($_.Name) -> $([int[]][char[]]$_.Name -join ' ')" } - So sánh hai file trùng. Chữ
édạng NFC hiện là233, dạng NFD hiện là101 769(chữecộng một dấu kết hợp). Với tiếng Việt, chữệdạng NFC là một số duy nhất7879, còn dạng NFD là chuỗi101 803 770(chữe, dấu nặng, dấu mũ). Nói chung, hễ thấy một chữ cái không dấu đi kèm những số trong khoảng 768–879 là tên đó đang ở dạng NFD. Âm tiết tiếng Hàn NFC là số đơn trong khoảng 44032–55203; dạng NFD là dãy số từ 4352 đến 4607.
Trên Mac (Terminal)
- Mở Terminal và
cdvào thư mục (gõcdrồi kéo thư mục từ Finder thả vào cửa sổ). - Chạy:
python3 -c "import os,unicodedata as u; [print(n, 'NFD' if n!=u.normalize('NFC',n) else 'NFC') for n in os.listdir('.')]" - Tên nào bị đánh dấu
NFDlà tên mà Windows và Linux sẽ coi là một file khác so với bản NFC "song sinh" của nó.
Kiểm tra nhanh không cần terminal
Sao chép tên file từ cửa sổ Properties (Windows) hoặc Get Info (Mac) và dán vào ô chuyển đổi văn bản trên ứng dụng web FilenameFixer. Nếu kết quả sau chuyển đổi khác với đoạn bạn dán, tên đó đang ở dạng NFD. Việc chuyển đổi diễn ra ngay trong trình duyệt, không gửi gì lên máy chủ.
Sửa những file đang có sẵn
Trước hết quyết định bản nào là bản hiện hành. Mở cả hai, xem ngày sửa đổi, giữ file mới hơn hoặc đầy đủ hơn. Sau đó đưa tên của file được giữ lại về NFC.
Cách 1: gõ lại tên trên Windows
Chuột phải vào file, chọn Rename, xóa toàn bộ tên và gõ lại từ bàn phím. Windows tạo ra NFC khi bạn gõ, nên tên gõ mới luôn ở đúng dạng. Nếu dùng Unikey, giữ bảng mã Unicode (dựng sẵn), đừng chọn Unicode tổ hợp. Cách này ổn với một hai file và không cần công cụ gì. Nhưng nếu bạn dán lại tên cũ thì không được, vì dán giữ nguyên byte NFD.
Cách 2: đổi tên hàng loạt ngay trên Mac trước khi file lên ổ chia sẻ
Nếu file bắt nguồn từ Mac, sửa ngay tại gốc. Mở ứng dụng web FilenameFixer, kéo các file hoặc cả thư mục thả vào trang, rồi tải về với tên đã chuyển sang NFC. Công cụ miễn phí, xử lý được cả lô, và vì chạy cục bộ trong trình duyệt nên bản thân file không rời khỏi máy bạn. Đây là lối đi thực tế khi một bạn thiết kế hay biên dịch sắp bỏ năm mươi file tên tiếng Việt có dấu vào thư mục chung.
Cách 3: dòng lệnh trên NAS hoặc máy chủ Linux
Nếu bạn có quyền shell vào NAS hoặc máy chủ Samba, convmv chuẩn hóa tên tại chỗ:
convmv -f utf8 -t utf8 --nfc -r /volume1/shared/du-an
Chạy lần đầu không có --notest để xem nó sẽ đổi gì, rồi thêm --notest để áp dụng. Ở đâu không có convmv, một vòng lặp os.rename ngắn trong Python với unicodedata.normalize('NFC', name) làm được việc tương tự.
Cách 4: PowerShell cho cả thư mục trên Windows
Get-ChildItem -Recurse | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } |
ForEach-Object { Rename-Item $_.FullName $_.Name.Normalize('FormC') }
Nếu bản NFC đã tồn tại, Rename-Item báo lỗi với file đó. Đây lại là lưới an toàn hữu ích: nó buộc bạn gộp hai bản một cách có chủ đích thay vì ghi đè nhầm.
File ZIP gửi qua Zalo hoặc email
Khi các file trùng nằm trong một file ZIP do người dùng Mac nén, giải nén trên Windows sẽ tái hiện lỗi trong mọi thư mục được bung ra. Thay vì đổi tên sau khi giải nén, bạn có thể đưa file nén qua công cụ khôi phục tên file trong ZIP (hỗ trợ file nén tới 200 MB). Công cụ ghi lại các mục trong ZIP về NFC và trả lại một file ZIP giải nén sạch sẽ.
Phòng tránh đợt trùng lặp tiếp theo
Đổi tên là việc dọn dẹp một lần. Những thói quen sau giữ cho ổ chia sẻ sạch về sau.
- Chuẩn hóa ngay lúc tải lên. Nếu nhóm làm việc chủ yếu trên Google Drive, Teams hay một hệ thống quản lý tài liệu chạy trên trình duyệt, người dùng Mac có thể cài tiện ích FilenameFixer cho Chrome. Tiện ích tự động chuyển tên file sang NFC mỗi khi tải file lên qua trang web, nên tên NFD không bao giờ tới được dịch vụ.
- Đặt
core.precomposeUnicodetrong Git trên mọi máy Mac. Chạygit config --global core.precomposeUnicode true. Git sẽ chuyển đường dẫn NFD sang NFC trước khi lưu, chấm dứt cảnh xóa-rồi-thêm giả giữa người dùng Mac và Windows. - Giao cho một người tạo thư mục dùng chung và file mẫu. Tên thư mục được sao chép nhiều hơn tên file rất nhiều. Nếu thư mục gốc là
Đánh giá 2026ở dạng NFD, mọi thư mục con mà người dùng Mac tạo ra đều kế thừa lỗi. Tạo cấu trúc từ máy Windows, hoặc chuẩn hóa nó một lần, loại bỏ được phần lớn trùng lặp về sau. - Ưu tiên ASCII không dấu cho các đường dẫn dùng lâu dài. Không phải lúc nào cũng chấp nhận được, và không ai nên phải bỏ dấu tên riêng của mình. Nhưng với mã nội bộ như
2026-Q3-ngan-sachthay vìNgân sách hè 2026, bỏ dấu không mất gì mà tránh được hoàn toàn vấn đề. - Để ý triệu chứng, không chỉ nguyên nhân. "Tìm không ra", "đồng bộ báo conflicted copy", "hai file y hệt mà một file 0 byte" đều là cùng một lỗi. Khi đồng nghiệp báo một trong các hiện tượng này, hãy kiểm tra mã ký tự trước khi ai đó bắt đầu xóa file.
Không việc nào ở trên đòi hỏi mua phần mềm. Gõ lại tên, PowerShell, convmv và thiết lập Git đều có sẵn hoặc miễn phí. FilenameFixer có chỗ đứng khi số lượng file lớn, khi file còn chưa rời khỏi Mac, hoặc khi bạn muốn việc chuyển đổi diễn ra âm thầm lúc tải lên thay vì thêm một thứ nữa phải nhớ.