Khi một tựa đề tiếng Ả Rập, Ba Tư hay Urdu đến cửa hàng với dấu ngoặc nằm sai bên, phần ghi công “feat.” bị đẩy sang tận đầu kia, hay một mã danh mục trôi vào chỗ lẽ ra không nên, thì chẳng có gì hỏng cả. Các byte bạn gõ gần như luôn là các byte đã đến nơi. Thứ thay đổi là hướng nền của cái khung mà văn bản được vẽ vào, và điều đó do trang của cửa hàng quyết định, không phải do tựa đề của bạn. Bài này giải thích cơ chế đủ chính xác để bạn dự đoán được tựa đề nào của mình sẽ vỡ trước khi giao nộp.
Có một điều cần nói ngay từ đầu, vì đó là lập trường trung thực: chúng tôi không biết đến bất kỳ phép đo nào đã công bố về tỷ lệ lỗi siêu dữ liệu chữ Ả Rập ở bất cứ đâu trong ngành. Vấn đề thì ai cũng gặp mà hoàn toàn chưa được định lượng. Bên dưới không có con số nào, vì không có con số nào để đưa ra.
Thứ tự logic và thứ tự hiển thị là hai chuyện khác nhau
Unicode lưu văn bản theo thứ tự logic — thứ tự bạn nói nó, gõ nó và đọc to nó lên. Thứ tự hiển thị được tính ra từ đó lúc dựng hình, bằng Thuật toán Hai Chiều của Unicode được định nghĩa trong Unicode Standard Annex #9 (UAX #9). Bản phụ lục nói thẳng về sự tách bạch này: “The Unicode Standard prescribes a memory representation order known as logical order”, và “When working with bidirectional text, the characters are still interpreted in logical order—only the display is affected”.
Chỉ một câu ấy đã giải thích hiện tượng khiến các nghệ sĩ dùng chữ Ả Rập tin rằng siêu dữ liệu của mình bị ma ám: chuỗi được lưu có thể hoàn toàn đúng trong khi phần hiển thị lại sai, và nó có thể đúng về mặt nhìn trong khi các byte được lưu lại sai — mà trên màn hình hai kiểu hỏng đó trông y hệt nhau. Bạn không thể kiểm chuyện này bằng mắt. Nhân viên hỗ trợ của nhà phân phối cũng không.
Vì sao một cụm Latin nằm trong chuỗi RTL lại dịch chuyển
UAX #9 gán cho mỗi ký tự một kiểu hai chiều. Chữ cái Ả Rập, Ba Tư và Urdu là AL (chữ cái Ả Rập, phải sang trái). Chữ cái Latin là L. Chữ số ASCII là EN (European Number), chữ số Ả Rập-Ấn là AN (Arabic Number). Khoảng trắng và phần lớn dấu câu — kể cả dấu ngoặc đơn, ngoặc vuông, dấu gạch nối và dấu chấm — là trung tính, nghĩa là chúng không có hướng riêng và thừa hưởng hướng từ những gì xung quanh.
Hai nhóm quy tắc gây ra thiệt hại.
Hướng đoạn văn, quy tắc P2–P3. Thuật toán quét tìm ký tự có hướng mạnh đầu tiên và đặt hướng nền theo ký tự đó. Một tựa đề bắt đầu bằng một từ Latin sẽ nhận hướng trái sang phải ngay cả khi mọi thứ phía sau đều là tiếng Ba Tư.
Giải quyết ký tự trung tính, quy tắc N1–N2. Quy tắc N1: “A sequence of [neutrals] takes the direction of the surrounding strong text if the text on both sides has the same direction”. Quy tắc N2: các ký tự trung tính không có sự đồng thuận sẽ lấy hướng của đoạn văn. Rồi quy tắc L2 sắp xếp lại để hiển thị — “reverse any contiguous sequence of characters that are at that level or higher”.
Ghép lại thì thấy sự cố này có tính tất định chứ không ngẫu nhiên. Một cụm Latin — tên người remix, feat., Vol. 2, một mã danh mục, một năm — nằm ở mức nhúng khác với phần chữ Ả Rập quanh nó. Các ký tự trung tính ở ranh giới của nó (dấu cách, dấu ngoặc mở) có chữ Ả Rập ở một bên và chữ Latin ở bên kia, nên N1 không tìm được sự đồng thuận và N2 trao cho chúng hướng của đoạn văn. Một dấu ngoặc đã giải quyết theo một hướng trong trình soạn thảo phải sang trái của bạn sẽ giải quyết theo hướng kia trên trang cửa hàng trái sang phải, và dấu ngoặc rời ra rồi lật.
Vậy nên نام آهنگ (Nima Remix) không hề hỏng. Đó là một chuỗi được giải quyết trong hai ngữ cảnh. Hướng nền là ngữ cảnh chứ không phải nội dung, và ngữ cảnh của cửa hàng không phải ngữ cảnh của bạn.
Một điều bạn tuyệt đối không được làm
Đừng “sửa” phần hiển thị bằng cách gõ các ký tự ngược lại cho tới khi bản xem trước trông có vẻ đúng.
Cách đó tạo ra một chuỗi sai về thứ tự logic, đúng trong đúng một ngữ cảnh dựng hình, và hỏng ở mọi nơi khác — kể cả tìm kiếm, sắp xếp, khớp nghệ sĩ và mọi cửa hàng có trang với hướng nền khác với công cụ bạn đã “sửa” trong đó. Bạn sẽ biến một vấn đề hiển thị, vốn khôi phục được, thành một vấn đề dữ liệu, vốn thì không.
UAX #9 có định nghĩa các ký tự để điều khiển việc này một cách tường minh: các bộ cô lập LRI, RLI, FSI và PDI, và các dấu LRM, RLM và ALM. Về mặt kỹ thuật đó là cách sửa đúng. Nhưng chúng cũng là những ký tự định dạng vô hình, và nhiều quy trình giao nộp cắt bỏ ký tự định dạng vô hình mà không báo cho bạn. Hãy coi chúng là không đáng tin trong một trường siêu dữ liệu.
Cách sửa mang tính cấu trúc: đưa cụm Latin ra khỏi giữa chuỗi
Cách giảm thiểu có tác dụng ở mọi nơi, với mọi bộ dựng hình, không cần ký tự vô hình, là cách mang tính cấu trúc. Theo thứ tự ưu tiên:
- Hãy dùng các trường riêng thay cho chuỗi trộn hướng ở bất cứ đâu mô hình dữ liệu cho phép. Một nghệ sĩ khách mời thuộc về cấp vai trò nghệ sĩ, không thuộc về tựa đề. Music Metadata Style Guide của Music Biz khuyên ghi công nghệ sĩ khách mời ở cấp vai trò nghệ sĩ và không đưa dữ liệu đó vào tựa đề bản nhạc hay bản phát hành; hướng dẫn công khai của Spotify là “You shouldn't include any artists' names in your track or release titles”. Một phiên bản thuộc về trường phiên bản, vốn có nhiệm vụ duy nhất là phân biệt hai bản ghi trùng tựa đề. Mỗi cụm Latin bạn chuyển sang trường riêng của nó là một ranh giới hai chiều thôi tồn tại.
- Giữ mọi cụm Latin không thể tránh khỏi ra khỏi vị trí đầu tiên. Vị trí đầu tiên đặt hướng của đoạn văn theo P2–P3. Một tựa đề tiếng Ba Tư mở đầu bằng một từ Latin là một đoạn văn trái sang phải có chứa tiếng Ba Tư, và đó không phải điều bạn muốn nói.
- Tránh dấu câu trang trí ở ranh giới hướng. Dấu gạch ngang, dấu gạch chéo, dấu sổ đứng và các lớp ngoặc lồng nhau đều là ký tự trung tính nằm đúng chỗ mà thuật toán có ít thông tin nhất.
Ở nơi hợp đồng thực sự đòi phần ghi công phải nằm trong tựa đề, các quy ước đã cố định và đáng làm theo cho đúng. Music Biz, về “feat.” và “with”: “when included in the title are generally lowercase and in English”. Hướng dẫn văn phong của Apple: “Formatting of 'feat.' and 'with' must be lowercase, in English, not localized, and in parentheses or brackets”. Chỉ dẫn “not localized” ở đây gánh việc thật — đừng dịch “feat.” sang tiếng Ả Rập, Ba Tư hay Urdu trong trường tựa đề. Đó là một token máy đọc được, không phải một từ.
Chữ số, và vì sao chữ số của bạn có thể không phải chữ số bạn tưởng
Có ba bộ chữ số đang được dùng:
| Bộ | Điểm mã | Dùng ở | Lớp hai chiều |
|---|---|---|---|
| ASCII | 0–9 | khắp nơi | EN |
| Ả Rập-Ấn | U+0660–U+0669 (٠١٢٣٤٥٦٧٨٩) | tiếng Ả Rập | AN |
| Ả Rập-Ấn mở rộng | U+06F0–U+06F9 (۰۱۲۳۴۵۶۷۸۹) | tiếng Ba Tư, Urdu | EN |
Đây không phải các biến thể phong cách. Chúng là những điểm mã khác nhau, và theo Cơ sở dữ liệu Ký tự Unicode, chúng thậm chí không cùng một lớp hai chiều. Quy tắc W2 của UAX #9 đổi kiểu một số châu Âu thành số Ả Rập khi ký tự mạnh đứng liền trước gần nhất là một chữ cái Ả Rập, nên bên trong văn bản tiếng Ba Tư hai loại có thể hành xử giống nhau lúc hiển thị — nhưng không bao giờ giống nhau khi sắp xếp, tìm kiếm hay so sánh chuỗi, vì chúng là những ký tự khác nhau. Một “Vol. 2” gõ bằng chữ số Ả Rập-Ấn mở rộng ۲ và một “Vol. 2” gõ bằng số 2 ASCII là hai chuỗi khác nhau trông gần như y hệt.
Hãy chọn một bộ chữ số cho cả danh mục và đừng bao giờ trộn các bộ trong cùng một chuỗi.
Cách kiểm tra thứ bạn thực sự đã gõ
Phần hiển thị không đáng tin, nên hãy kiểm các byte. Có ba việc đáng làm trước mỗi lần giao nộp:
- Đọc chuỗi dưới dạng điểm mã, đừng đọc dưới dạng glyph. Bất kỳ công cụ nào cho bạn thấy giá trị U+ đều lập tức cho bạn biết đó là chữ ی Ba Tư (U+06CC) hay chữ ي Ả Rập (U+064A), chữ ک Ba Tư (U+06A9) hay chữ ك Ả Rập (U+0643) — một khác biệt mà phần lớn phông chữ san phẳng và không người soát nào nhìn ra. Điều tương tự áp dụng cho một dấu tatweel lạc (U+0640), thứ mà không dạng chuẩn hóa Unicode nào loại bỏ, và cho một ký tự không nối rộng không (U+200C) mà một ô nhập liệu đã lặng lẽ nuốt mất.
- Dán tựa đề vào một ngữ cảnh trái sang phải và một ngữ cảnh phải sang trái rồi so sánh. Nếu dấu câu rơi khác nhau ở hai chỗ, bạn đang có một chuỗi trộn hướng và một cụm Latin lẽ ra phải nằm trong trường riêng của nó.
- Đối chiếu với bản phát hành trước, từng ký tự một, đừng nhìn bằng mắt. Danh mục bị tách ở chữ Ả Rập gần như luôn do một khác biệt vô hình gây ra: một bản phát hành gõ trên bố cục bàn phím Ba Tư, bản kế tiếp gõ trên bố cục Ả Rập.
Công cụ của Mazufa chạy hoàn toàn trong trình duyệt của bạn — không có tệp âm thanh và không có văn bản nào được tải lên — và chúng tự đặt dir="rtl" khi một tựa đề viết từ phải sang trái, nên thứ bạn thấy trong lúc gõ khớp với ngữ cảnh mà chuỗi được viết ra cho nó. mazufa.com cũng có một công cụ kiểm tra siêu dữ liệu miễn phí chạy trên chính thiết bị của bạn và đánh dấu vài trường hợp vô hình: trộn bộ chữ số, tatweel, ZWNJ thừa hoặc thiếu, yeh và kaf Ả Rập so với Ba Tư, và các chuỗi không ở dạng NFC.
Việc cần làm trước khi giao nộp
Lấy tựa đề và tên nghệ sĩ của bản phát hành tới và làm bốn việc. Chuyển mọi cụm Latin có thể chuyển sang trường riêng của nó — nghệ sĩ khách mời sang vai trò nghệ sĩ, phiên bản sang trường phiên bản. Bảo đảm không có gì bắt đầu bằng một từ Latin. Thống nhất bộ chữ số và bỏ mọi dấu tatweel. Rồi đọc chuỗi dưới dạng điểm mã một lần, và lưu đúng chuỗi đó làm cách viết chuẩn mà bạn sẽ dùng lại cho mọi bản phát hành sau này, không gõ lại.
Nếu một tựa đề vẫn buộc phải mang một cụm Latin ở giữa, hãy cứ giao nộp và chấp nhận rằng nó sẽ hiển thị khác nhau ở những nơi khác nhau. Đó là một kết quả hiển thị, không phải hư hỏng. Chuỗi vẫn đúng. Gõ ngược nó lại cho một bản xem trước trông đúng mới là cách duy nhất làm nó sai thật.
Nguồn
- Unicode Standard Annex #9, Unicode Bidirectional Algorithm (Revision 51, Unicode 17.0.0, 2025-08-13) — https://www.unicode.org/reports/tr9/
- Unicode Standard Annex #15, Unicode Normalization Forms (Version 57, Unicode 17.0.0, 2025-07-30) — https://www.unicode.org/reports/tr15/
- Unicode Character Database — thuộc tính ký tự: lớp hai chiều, ánh xạ phân rã — https://www.unicode.org/ucd/
- Music Business Association, Music Metadata Style Guide v2.1 — https://www.musicbiz.org/wp-content/uploads/2016/04/MusicMetadataStyleGuide_V2.1.pdf
- Apple Music Style Guide — https://help.apple.com/itc/musicstyleguide/en.lproj/static.html
- Spotify for Artists, Music metadata guidelines — https://support.spotify.com/us/artists/article/metadata-formatting-guidelines/
Kho tư liệu cung cấp phiên bản và ngày sửa đổi của các tài liệu này, như liệt kê ở trên, và không ghi một ngày đọc riêng cho chúng.