← Tất cả bài viết

Lỗi tên file tiếng Việt khi upload (NFD/NFC): 5 cách sửa

Nếu bạn gặp lỗi tên file tiếng Việt khi upload từ máy Mac lên website: tên hiện lên trông hơi "lệch" dấu, link tải về báo "không tìm thấy file", hoặc gõ tên vào ô tìm kiếm mà không ra, thì gần như chắc chắn bạn đang vướng vấn đề NFD/NFC. macOS lưu các ký tự có dấu (và chữ viết không phải Latin) ở dạng Unicode tách rời (NFD), trong khi phần lớn máy chủ web, hệ quản trị nội dung và trình duyệt lại mặc định dạng gộp (NFC). Cách sửa là đổi tên file sang NFC trước khi upload, hoặc để máy chủ tự chuẩn hóa khi nhận file. Dưới đây là năm biểu hiện thường gặp trên website, nguyên nhân của từng cái và cách xử lý nhanh nhất.

Lỗi tên file tiếng Việt khi upload bắt đầu từ đâu

Một chữ như é có thể được ghi theo hai cách trong Unicode. Cách gộp là một mã duy nhất, U+00E9. Cách tách là hai mã: chữ e thường rồi đến một dấu sắc kết hợp đứng sau. Trên màn hình, hai cách này nhìn y hệt nhau. Tiếng Việt còn nặng hơn vì rất nhiều chữ mang cùng lúc hai dấu: ệ ở dạng gộp là một mã (U+1EC7), nhưng ở dạng tách là e cộng dấu mũ cộng dấu nặng, tức ba mã cho một chữ. Một cái tên như "Nguyễn Thị Hồng" ở dạng NFD dài hơn hẳn so với dạng NFC dù hiển thị không khác gì.

Từ trước đến nay, khi bạn đặt tên file có dấu trên macOS, hệ thống thường tạo ra phiên bản tách rời (NFD). Hầu như mọi thứ còn lại, gồm Windows, máy chủ Linux, PHP, Node, các framework web Python và chính trình duyệt hiển thị kết quả, đều coi tên là NFC. Khi một tên NFD đi vào hệ thống coi mặc định là NFC, hệ thống không "sửa giúp"; nó xem đó là một chuỗi ký tự khác. Chỉ một sự lệch pha đó giải thích cho toàn bộ các biểu hiện bên dưới.

Ai đặt tên file có ký tự ngoài bảng ASCII đều có thể gặp: Báo_cáo_quý_1_Nguyễn_Thị_Hồng.pdf, Hợp_đồng_thuê_nhà_Trần_Văn_Đạt.docx, Ảnh_kỷ_yếu_lớp_12A3.jpg, hay một file tiếng Hàn đồng nghiệp gửi tên 예산안_2026.xlsx. Nếu tên file của bạn thuần ASCII (bao_cao_2026.pdf), bạn không cần đọc tiếp.

Năm biểu hiện và cách sửa từng cái

1. Dấu bị tách rời hoặc chữ bị "văng" khỏi nguyên âm sau khi upload

Bạn thấy gì: Danh sách file trong CMS, hệ thống học trực tuyến hay cổng khách hàng hiện Nguyê˜n.pdf với dấu ngã trôi lơ lửng, Hô.ng với dấu nặng nằm riêng, hoặc tên tiếng Hàn thành ㅎㅏㄴㄱㅡㄹ.docx với từng chữ cái tách rời. Trên hệ thống khác thì tên vẫn bình thường.

Vì sao: Font hoặc lớp hiển thị của website không biết ghép chữ gốc với dấu kết hợp đứng riêng, nên vẽ chúng cạnh nhau.

Cách sửa: Đổi tên file sang NFC rồi upload lại. Nếu nền tảng không cho xóa bản lỗi, nhờ quản trị viên xóa giúp, vì upload bản đã sửa nhiều khả năng sẽ tạo thêm một file thứ hai thay vì ghi đè (xem biểu hiện 4).

2. Link tải về báo 404 hoặc "không tìm thấy file"

Bạn thấy gì: File upload lên không báo lỗi, vẫn nằm trong thư viện media. Bấm vào link tải thì ra 404, hoặc trang báo file không tồn tại.

Vì sao: Máy chủ lưu file dưới tên NFD, nhưng đường link nó sinh ra, hoặc bản ghi trong cơ sở dữ liệu, đã bị chuẩn hóa thành NFC ở đâu đó trên đường đi. URL trỏ tới một cái tên lệch vài byte so với file thật trên đĩa. Hai cái nhìn giống hệt nhau trên thanh địa chỉ.

Cách sửa: Với một lần lẻ, upload lại với tên NFC. Nếu đây là website của chính bạn, cách sửa thật sự nằm ở phía máy chủ: chuẩn hóa mọi tên file nhận vào thành NFC trước khi lưu. Trong Python là unicodedata.normalize("NFC", name); trong JavaScript là name.normalize("NFC"); trong PHP là Normalizer::normalize($name, Normalizer::FORM_C). Làm một lần ngay tại điểm nhận upload, vấn đề biến mất cho mọi người dùng.

3. Tìm không ra file dù nó nằm ngay trước mắt

Bạn thấy gì: Bạn gõ Hồng vào ô tìm kiếm của trang, hoặc bấm Ctrl+F trên danh sách file, không có kết quả nào. Nhưng file vẫn hiện rõ trong danh sách.

Vì sao: Tìm kiếm so sánh chuỗi byte. Bạn gõ ra NFC; tên đang lưu là NFD. Hai chuỗi không bằng nhau nên không khớp. Một số ứng dụng email cũng gặp đúng chuyện này khi tìm theo tên file đính kèm.

Cách sửa: Đổi tên sang NFC và upload lại. Cách tạm thời: tìm theo phần tên không có dấu, chẳng hạn 2026, 12A3 hay Nam thay vì Nguyễn, vì phần đó khớp với cả hai dạng.

4. "File trùng tên đã tồn tại", hoặc hai file trông y hệt nhau

Bạn thấy gì: Nền tảng từ chối upload, hoặc bạn có hai file với cái tên nhìn giống nhau từng chữ.

Vì sao: Một bản là NFD, bản kia là NFC. Với hệ thống đó là hai cái tên khác nhau, nên nó hoặc báo xung đột trong bảng ánh xạ tên, hoặc vui vẻ lưu cả hai.

Cách sửa: Xóa bản NFD, giữ bản NFC. Nếu nhìn không phân biệt được, tải cả hai về và kiểm tra (xem phần "Cách biết tên file đang ở dạng nào" bên dưới).

5. Script, công cụ nhập liệu hoặc biểu mẫu từ chối tên file

Bạn thấy gì: Công cụ nhập hàng loạt, biểu mẫu có kiểm tra tên file, hay script build báo lỗi "ký tự không hợp lệ", dù tên chỉ toàn chữ cái bình thường.

Vì sao: Quy tắc kiểm tra viết bằng biểu thức chính quy thường cho phép chữ có dấu dạng gộp nhưng không cho phép dấu kết hợp. Chữ ệ dạng tách chứa U+0302 và U+0323, hai mã mà nhiều mẫu "chỉ cho phép chữ cái" không chấp nhận.

Cách sửa: Chuẩn hóa về NFC trước khi file đến bước kiểm tra. Nếu bạn là người viết bộ kiểm tra, hãy chuẩn hóa đầu vào trước, rồi mới kiểm tra.

Cách biết tên file đang ở dạng nào

Nhìn bằng mắt thì không phân biệt được, đó chính là cốt lõi của vấn đề. Ba cách kiểm tra đáng tin:

  1. Trên Mac, trong Terminal: ls | xxd | head. Chữ ệ dạng gộp hiện ra là e1 bb 87. Dạng tách hiện ra là 65 cc a3 cc 82 (chữ e, rồi hai dấu kết hợp).
  2. Trên Windows, trong PowerShell: [int[]][char[]]"Việt" in ra các mã ký tự. Nếu thấy 7879 ở vị trí chữ ệ là dạng gộp; nếu thấy 101, 803, 770 là dạng tách.
  3. Trong console của bất kỳ trình duyệt nào: "Việt".normalize("NFD") === "Việt" trả về true nếu chuỗi bạn dán vào đã là NFD. Một mẹo nhanh hơn: "Việt".length cho ra 4 nếu là NFC và 6 nếu là NFD.

Gõ lại tên bằng tay trong Finder đôi khi cho ra NFC, đôi khi không, tùy hệ thống tệp và cách bạn nhập, nên tự gõ lại không phải cách sửa đáng tin nếu chỉ dùng một mình.

Sửa tên file hàng loạt trước khi upload

Với một hai file, gõ lại tên trên máy Windows hoặc đổi tên trên máy chủ sau khi upload là đủ. Với một thư mục 80 tấm ảnh kỷ yếu có tên tiếng Việt, hay cả một học kỳ tài liệu, cách đó không còn thực tế.

Những lựa chọn không cần cài thêm gì:

  • Đặt tên không dấu. Hop_dong_Tran_Van_Dat.pdf không bao giờ dính lỗi này. Đây là lựa chọn bền nhất cho bất cứ thứ gì sẽ được chia sẻ công khai qua link.
  • Chuẩn hóa bằng một dòng script. Trên macOS có sẵn Python: for f in *; do mv "$f" "$(python3 -c 'import sys,unicodedata;print(unicodedata.normalize("NFC",sys.argv[1]))' "$f")"; done. Cách này chạy được, nhưng sẽ đổi tên cả những thứ bạn không định đụng tới nếu bạn chạy nhầm thư mục.
  • Sửa ở phía máy chủ. Nếu bạn quản lý website, chuẩn hóa ngay khi nhận upload bảo vệ mọi người dùng về sau, không chỉ riêng bạn.

Nếu bạn không muốn chạy script, FilenameFixer là một ứng dụng web miễn phí làm đúng việc chuyển đổi này. Bạn kéo thả file vào trình duyệt, nó đổi tên hàng loạt từ NFD sang NFC, và toàn bộ xử lý diễn ra ngay trong trình duyệt chứ không tải file lên máy chủ. Nó cũng nhận văn bản dán vào, tiện để kiểm tra nhanh một cái tên, và có thể khôi phục tên file bên trong file ZIP dung lượng tới 200 MB. Riêng cho tình huống upload, tiện ích mở rộng Chrome đi kèm sẽ tự động chuẩn hóa tên file ngay lúc bạn tải lên website, nên năm biểu hiện ở trên không xảy ra ngay từ đầu. Trang web có bản tiếng Việt, tiếng Anh, Hàn, Nhật, Pháp, Đức và Tây Ban Nha.

Một giới hạn cần nói thẳng: không cách nào trong số này sửa được file đã nằm sẵn trên máy chủ dưới tên lỗi. Với những file đó, hãy xóa rồi upload lại, hoặc nhờ người quản lý website đổi tên trực tiếp trên đĩa.

Bảng tra nhanh

Biểu hiện Xảy ra ở đâu Cách sửa
Dấu tách rời, chữ bị văng Danh sách file, thư viện media Đổi tên sang NFC, upload lại
Link tải báo 404 URL công khai, CMS Upload lại; chuẩn hóa phía máy chủ
Tìm không ra Tìm kiếm trên trang, Ctrl+F, email Đổi tên sang NFC; tìm phần không dấu
Trùng tên hoặc "đã tồn tại" Upload, thư mục chia sẻ Xóa bản NFD

Một khi bạn biết hai cái tên nhìn giống hệt nhau có thể là hai chuỗi khác nhau, mọi biểu hiện ở trên đều trở nên dễ đoán. Chuẩn hóa về NFC trước khi file rời khỏi máy Mac, hoặc ngay cửa vào của máy chủ, và website sẽ hiểu tên file đúng như bạn vẫn mong đợi.