ZIP từ Mac lỗi tên file tiếng Việt trên Windows: cách sửa
Nếu file ZIP từ Mac lỗi tên file tiếng Việt khi mở trên Windows, hiện ra kiểu Hợp_đồng_Nguyá»…n.pdf thay vì Hợp_đồng_Nguyễn.pdf, thì file nén đã được giải nén bằng sai bảng mã; giải nén lại bằng 7-Zip hoặc một công cụ hiểu UTF-8 thường là xong. Còn nếu tên file nhìn bình thường nhưng gõ tìm không ra, tải lên web bị từ chối, hoặc tự nhiên có hai file Báo_cáo_tháng_3.xlsx nằm cạnh nhau, thì dấu tiếng Việt đang được lưu thành nhiều ký tự rời (chữ cái trần cộng dấu mũ, dấu nặng đi kèm) và cần được chuẩn hóa lại. Hai lỗi này đến từ cùng một file ZIP nhưng cách sửa khác nhau, nên việc đầu tiên là phân biệt cho đúng.
Vì sao ZIP từ Mac lỗi tên file tiếng Việt trên Windows
Định dạng ZIP không có một quy tắc chung bắt buộc về cách mã hóa tên file. Mỗi phần mềm tạo file nén tự quyết định cách ghi tên, và mỗi phần mềm mở file nén tự quyết định cách đọc. Mac và Windows đã chọn hai hướng khác nhau trong nhiều năm, và tiếng Việt với hệ thống dấu dày đặc nằm đúng chỗ dễ vỡ nhất.
Nguyên nhân 1: lỗi font do đọc sai bảng mã
Khi bạn chuột phải vào thư mục trong Finder và chọn Compress, macOS ghi tên file bên trong ZIP theo UTF-8. Windows Explorer đời cũ và một số phần mềm bên thứ ba lại mặc định tên trong ZIP dùng bảng mã cũ của Windows (thường là Windows-1252 nếu máy đặt ngôn ngữ hệ thống là tiếng Anh). Đọc chuỗi byte UTF-8 như thể nó là Windows-1252 thì ợ thành ợ, đ thành Ä‘, ễ thành á»…. Vì vậy Hợp đồng biến thành Hợp đồng và Nguyễn thành Nguyá»…n.
Đây hoàn toàn là lỗi hiển thị và giải nén. Dữ liệu trong file nén vẫn nguyên vẹn; chỉ là phần mềm giải nén đoán sai bảng mã.
Nguyên nhân 2: dấu bị tách rời (NFD) nhìn đúng nhưng không đúng
Kể cả khi giải nén hoàn toàn suôn sẻ vẫn còn một vấn đề thứ hai, âm thầm hơn. macOS có xu hướng lưu một chữ cái có dấu thành nhiều mã Unicode: chữ cái gốc, rồi từng dấu đi kèm là một ký tự riêng. Dạng này gọi là Normalization Form D (NFD). Windows, trình duyệt web và hầu hết máy chủ lại mong đợi dạng gộp sẵn thành một ký tự, Normalization Form C (NFC).
Tiếng Việt bị nặng hơn các ngôn ngữ khác vì nhiều chữ mang cùng lúc hai dấu: ệ ở dạng NFD là e + dấu mũ + dấu nặng, tức ba ký tự thay vì một. Một cái tên như Nguyễn Thị Hồng có thể dài thêm năm, sáu ký tự mà mắt thường không thấy gì khác.
Windows vẫn vui vẻ tạo file có tên chứa e + dấu mũ + dấu nặng. Trên màn hình nó hiện ra là ệ, nên trông chẳng có gì sai. Nhưng với hệ thống file, đó là một chuỗi khác hẳn chữ ệ bạn gõ bằng Unikey trên Windows. Hậu quả xuất hiện về sau:
- Windows Search và ô tìm kiếm trong Explorer không tìm ra
Hợp đồngkhi bạn gõ đúng chữ đó. - Công thức VLOOKUP trong Excel hoặc script so khớp theo tên file thất bại đúng ở những file có dấu.
- Chép thư mục vừa giải nén đè lên thư mục cũ thì sinh ra bản sao: hai file
Hồ_sơ_Trần_Thị_Hồng.docxvới dung lượng và ngày khác nhau. - Cổng nộp hồ sơ hoặc form upload trên web từ chối file, hoặc lưu tên với những đoạn
%CC%A3kỳ lạ trong đường dẫn.
Nếu triệu chứng của bạn khớp danh sách này, giải nén lại sẽ không giúp gì. Tên file cần được chuyển từ NFD sang NFC sau khi giải nén.
Kiểm tra nhanh: bạn đang gặp lỗi nào?
Thường chỉ cần nhìn danh sách file là biết.
- Thấy ký tự rác (
ợ,Ä‘,’,é): đây là lỗi bảng mã, Nguyên nhân 1. Chuyển sang mục tiếp theo. - Tên nhìn bình thường nhưng hoạt động kỳ lạ: nhiều khả năng là NFD, Nguyên nhân 2. Xác nhận bằng PowerShell:
$name = (Get-Item -LiteralPath "C:\Users\ban\Downloads\giai_nen\Hợp_đồng_Nguyễn.pdf").Name
$name.Length
$name.IsNormalized([Text.NormalizationForm]::FormC)
Dán đường dẫn tới một file đáng ngờ. Hợp_đồng_Nguyễn.pdf có 19 ký tự nhìn thấy được, nhưng ở dạng NFD thì ợ, ồ và ễ mỗi chữ thêm hai ký tự, nên Length trả về 25. Nếu Length lớn hơn số ký tự bạn đếm được và IsNormalized trả về False, tên file đang ở dạng tách rời.
Cách kiểm tra nhanh hơn nếu bạn quen dùng chuột: nhấn F2 vào file trong Explorer, đặt con trỏ ngay sau chữ ệ rồi nhấn Backspace một lần. Nếu chỉ một dấu biến mất mà chữ cái vẫn còn (chẳng hạn ệ thành ẹ hoặc ê), thì dấu đó đang là ký tự riêng.
Sửa lỗi font: giải nén lại file ZIP từ Mac bằng công cụ hiểu UTF-8
Xóa thư mục đã giải nén bị lỗi tên để khỏi bị hai bản, rồi giải nén lại file .zip gốc bằng công cụ đọc được tên UTF-8.
7-Zip (miễn phí, Windows)
- Cài 7-Zip từ trang chủ nếu máy chưa có.
- Chuột phải vào file ZIP trong Explorer, chọn 7-Zip › Extract Here (trên Windows 11 có thể phải bấm Show more options trước).
- Kiểm tra tên vừa giải nén.
Hợp đồnggiờ phải đọc làHợp đồng.
Giải nén có sẵn của Windows 10 và 11
Các bản Windows gần đây xử lý tên UTF-8 trong ZIP tốt hơn hẳn đời cũ. Nếu đồng nghiệp dùng máy đã cập nhật giải nén cùng file mà không bị rác, thì vấn đề nằm ở công cụ giải nén của bạn, không phải ở file. Thử Extract All trong Explorer, hoặc trong PowerShell:
Expand-Archive -LiteralPath "C:\duong\dan\file.zip" -DestinationPath "C:\duong\dan\thu_muc_dich"
Nếu 7-Zip vẫn hiện rác
Thỉnh thoảng phía Mac dùng một phần mềm nén cũ hoặc lạ, ghi tên theo Mac OS Roman hay một bảng mã cũ khác. 7-Zip và WinRAR cho phép chọn bảng mã khi mở file nén; thử lần lượt các tùy chọn cho đến khi tên đọc đúng. Nếu không cách nào được, nhờ người gửi tạo lại file nén bằng lệnh Compress trong Finder hoặc zip -r trong Terminal, cả hai đều ghi UTF-8.
Khi tên đã hiển thị đúng, chạy lại bước kiểm tra NFD ở mục trước. Chuyện sửa xong Nguyên nhân 1 rồi phát hiện Nguyên nhân 2 nằm bên dưới là rất thường gặp.
Sửa dấu bị tách rời sau khi giải nén
Bước này gộp e + dấu mũ + dấu nặng thành một chữ ệ duy nhất, và làm tương tự với mọi chữ có dấu khác trong thư mục. Có hai cách thực tế.
Cách A: đổi tên bằng PowerShell (không cần cài thêm gì)
Đoạn lệnh sau đổi tên mọi file và thư mục con bên trong một đường dẫn sang dạng NFC. Nếu thư mục quan trọng, hãy chạy thử trên một bản sao trước.
$root = "C:\duong\dan\thu_muc_da_giai_nen"
Get-ChildItem -LiteralPath $root -Recurse |
Sort-Object { $_.FullName.Length } -Descending |
ForEach-Object {
$fixed = $_.Name.Normalize([Text.NormalizationForm]::FormC)
if ($fixed -ne $_.Name) {
$target = Join-Path $_.Directory.FullName $fixed
if (Test-Path -LiteralPath $target) {
Write-Warning "Bo qua (ten da ton tai): $($_.FullName)"
} else {
Rename-Item -LiteralPath $_.FullName -NewName $fixed
}
}
}
Vài điểm cần biết về cách nó hoạt động:
- Mục nằm sâu nhất được đổi tên trước, để việc đổi tên thư mục cha không làm hỏng đường dẫn của file bên trong.
- Nếu đã có sẵn file tên đúng (tình huống "hai file
Hồ_sơ_Trần_Thị_Hồng.docx"), script bỏ qua thay vì ghi đè, và báo cho bạn biết file nào cần tự gộp bằng tay. -LiteralPathlà bắt buộc; thiếu nó, dấu ngoặc vuông trong tên file có thể bị hiểu nhầm thành ký tự đại diện.
Cách B: sửa ngay trong file ZIP trước khi giải nén
Nếu bạn ngại chạy script, hoặc cần chuyển tiếp một file nén sạch cho người khác, công cụ khôi phục tên file trong ZIP của FilenameFixer nhận file ZIP gốc từ Mac (tối đa 200 MB), ghi lại các tên đang ở dạng tách rời bên trong thành NFC, và cho bạn tải về một file nén đã sửa. Việc xử lý diễn ra ngay trong trình duyệt; file nén không được tải lên máy chủ nào, điều đáng quan tâm khi bên trong là hợp đồng khách hàng hay hồ sơ nhân sự. Công cụ này miễn phí, và cùng ứng dụng web đó cũng xử lý được file rời bằng cách kéo thả nếu bạn đã giải nén thư mục rồi.
Cả hai cách cho cùng một kết quả: tên file mà Windows Search, script và form web đều coi là chữ ệ, ơ, đ, ữ bình thường. Phép chuyển đổi này không chỉ dành cho tiếng Việt; nó cũng sửa tên file tiếng Hàn bị tách thành từng nét và kana tiếng Nhật bị rời dấu đục, điều bạn sẽ gặp khi nhận file nén từ đối tác Hàn Quốc hay Nhật Bản.
Phòng tránh cho lần nhận file sau
Phần lớn chuyện này có thể chặn từ gốc, dù không phải tất cả.
- Nhờ người gửi nén bằng Finder hoặc
zip -rtrong Terminal. Cả hai đều ghi tên UTF-8, loại bỏ nguy cơ lỗi font trên các bản Windows hiện tại. Nhưng không cách nào chuẩn hóa sang NFC, nên vấn đề thứ hai vẫn có thể xảy ra. - Tránh đặt tên file có dấu khi file sẽ đi qua nhiều hệ điều hành, nếu hợp lý.
hop_dong_nguyen.pdfsống sót ở mọi nơi. Đây là cách né, không phải cách sửa, và không dùng được khi dấu là một phần tên người hay tên văn bản pháp lý. - Sửa tên ngay lúc tải lên nếu nỗi khổ thực sự của bạn là cổng nộp hồ sơ trên web từ chối file từ Mac. Tiện ích Chrome FilenameFixer tự động chuyển tên file sang NFC khi bạn upload trên các trang web, để cổng nhận được
Nguyễnở dạng ký tự gộp. - Với lập trình viên: chuẩn hóa tên file sang NFC ở phía máy chủ khi nhận upload, và trong các script build hoặc đồng bộ so sánh đường dẫn giữa bản checkout trên macOS và Windows.
unicodedata.normalize("NFC", name)trong Python vàString.Normalize()trong .NET là công cụ quen thuộc. Git có tùy chọncore.precomposeunicodeđể xử lý cùng vấn đề này trong kho mã clone trên Mac.
Một giới hạn cần nói thẳng: nếu một người dùng Windows đã đổi tên, chỉnh sửa và lưu file với tên dạng tách rời suốt nhiều tháng, việc chuyển đổi sau đó có thể đụng với bản sao tên đúng của chính những tài liệu ấy. Script PowerShell ở trên và công cụ ZIP đều giữ nguyên bản gốc trong trường hợp này, nhưng gộp hai phiên bản lại là việc phải làm tay. Bắt lỗi ngay lúc giải nén, như hướng dẫn ở đây, đỡ công hơn nhiều so với gỡ rối về sau.