Apple đang gặp phải một vài tháng nhiều lỗi. Giờ đây, một lỗi nghiêm trọng mới xuất hiện trong chức năng hiển thị văn bản trên iPhone. Lỗi này được kích hoạt bởi một ký tự Telugu đơn lẻ, có thể khiến iPhone rơi vào vòng lặp khởi động không thể thoát ra chỉ bằng việc nhận một thông báo chứa ký tự đó. Hãy cùng tìm hiểu tại sao một ký tự đơn lẻ lại gây ra vấn đề lớn như vậy cho iOS.
Lưu ý: Bản vá cho lỗi Telugu đã có sẵn trong phiên bản iOS mới nhất (11.2.6). Nếu ký tự Telugu khiến ứng dụng hoặc thiết bị của bạn bị treo, hãy khôi phục iPhone qua iTunes và cập nhật lên phiên bản iOS mới nhất. Nếu iPhone bị kẹt ở vòng lặp khởi động, bạn có thể cần đưa nó vào trạng thái Cập nhật Firmware Thiết bị (DFU) để iTunes nhận diện. Khi hoàn tất, hãy khôi phục thiết bị từ bản sao lưu gần nhất mà bạn hy vọng đã tạo.
Telugu là gì?

Telugu là một ngôn ngữ được nói và viết ở một số vùng của Ấn Độ, cụ thể là các bang Andhra Pradesh, Telangana và thị trấn Yanam. Giống như nhiều ngôn ngữ dựa trên chữ viết, như tiếng Ả Rập và các chữ Brahmic khác, Telugu sử dụng một số tính năng đặc biệt của bộ ký tự Unicode để hiển thị các ký tự của nó trên màn hình máy tính.
Trong khi hầu hết các chữ cái Latinh được biểu diễn bằng một điểm mã Unicode 8-bit đơn lẻ để tương thích ASCII (ví dụ: chữ A tồn tại tại điểm mã Unicode U+0041, được biểu diễn trong nhị phân là 01000001), các ngôn ngữ được viết bằng chữ viết hoặc chữ không phải Latinh thường kết hợp nhiều hơn một điểm mã Unicode để biểu diễn các ký tự của chúng.
Điều này đặc biệt đúng đối với các ngôn ngữ, như Telugu, kết hợp các phiên bản chữ cái của ngôn ngữ đó thành các cụm. Khác với các ligature (liên tự) mang tính cách điệu của tiếng Anh, sự kết hợp giữa các chữ cái Telugu quan trọng về mặt ngôn ngữ học. Để đáp ứng điều này, Unicode bao gồm một hệ thống phức tạp gắn các ký tự, mỗi ký tự được biểu diễn bằng điểm mã riêng, vào nhau.
Xét đến số lượng lớn các điểm mã Unicode, điều này có thể tạo ra sự đa dạng gần như vô hạn. Các điểm này kết hợp với nhau để hiển thị một ký tự có thể đọc được. Nhờ đó, Unicode không cần một điểm mã cho từng từ Telugu có thể có. Thay vào đó, Unicode kết hợp các phụ âm, nguyên âm và dấu thanh (“virama”) của Telugu lại với nhau để tạo thành các từ hiển thị như một ký tự đơn lẻ. Cách này cũng áp dụng cho các ngôn ngữ khác có quy tắc chính tả cho ligature, như tiếng Ả Rập.
Nguyên nhân gây ra sự sụp đổ là gì?

Vấn đề dường như liên quan đến Ký tự Không Rộng Không Kết Nối (Zero Width Non-Joiner - ZWNJ) tại điểm mã U+200C. ZWNJ yêu cầu hai ký tự liền kề hiển thị mà không cần ligature điển hình của chúng. Trong tiếng Anh, ZWNJ giữ cho các ký tự ff không được in với ligature kết nối tiêu chuẩn, thay vào đó tách biệt từng chữ f. Nhưng khi kết hợp với một tập hợp cụ thể bốn điểm mã Telugu (tất cả đều nên kết hợp thành một cụm đơn lẻ), iOS vì lý do nào đó không thể hiển thị kết quả đúng cách.
Một số người suy đoán rằng font San Francisco của Apple không thể hiển thị ký tự này, trong khi những người khác cho rằng quy trình hiển thị cụ thể của Apple là nguyên nhân. Dù nguyên nhân chính xác là gì, việc cố gắng hiển thị ký tự này gây ra sự sụp đổ nghiêm trọng của bất cứ thứ gì đang render nó, từ Messages, WhatsApp đến Springboard. Các điểm mã Unicode cấu thành ký tự (“gya” nghĩa là “kiến thức”) như sau:
U+0C1Cja (
)U+0C4Dvirama, hoặc dấu thanh (
)U+0C1Enya (
)U+200Czero width non-joinersU+0C3Eaa (
)
Nhưng chúng ta không thể đổ lỗi hoàn toàn cho Zero Width Non-Joiner (ZWNJ). Nó cũng được sử dụng trong các emoji gia đình vô hại (????) mà không gặp vấn đề gì. Vấn đề dường như là một tổ hợp cụ thể của một số điểm mã nhất định và ZWNJ. Thêm insult to injury (thêm đau vào đau), dường như ZWNJ hoặc không có tác động đặc biệt nào đến việc hiển thị cụm Telugu này, hoặc nó thậm chí không nên xuất hiện ở đó từ đầu.
Vấn đề với các chữ Brahmic khác
Telugu không phải là ngôn ngữ duy nhất gặp vấn đề này. Bengali và Devanagari, sử dụng Unicode theo cách tương tự cho chữ Brahmic của chúng, cũng gặp cùng vấn đề. Manish Goregaokar viết một bài blog thú vị và chi tiết phân tích sâu hơn trường hợp sụp đổ chính xác:
Bất kỳ chuỗi nào
<consonant1, virama, consonant2, ZWNJ, vowel>trong Devanagari, Bengali và Telugu, trong đó:1.
consonant2là suffix-joining (pstf/vatu)
2.consonant1không phải là chữ cái hình thành reph
3.vowelkhông có hai thành phần glyph
Kết luận: Tại sao Apple không phát hiện ra lỗi này?
Để hiểu tại sao lỗi này lọt qua, bạn phải đặt mình vào vị trí của Apple. Chắc chắn, tổ hợp ký tự này không phải là một từ quá hiếm trong tiếng Telugu. Nhưng iPhone hỗ trợ hàng chục ngôn ngữ. Có hàng tỷ tổ hợp tiềm năng trong Unicode. Với sự đa dạng lớn như vậy, việc kiểm tra có ý nghĩa cho các lỗi Unicode trước khi phát hành sẽ khiến việc cập nhật phần mềm định kỳ gần như không thể.
Tuy nhiên, lỗi này không nên gây ra thiệt hại lớn như vậy. Điện thoại không nên bị "brick" chỉ vì nội dung của một tin nhắn. Dù hindsight is 20/20 (sau sự việc thì mới thấy rõ), có vẻ như hiển thị ký tự dưới dạng hộp dấu hỏi () tốt hơn là làm sập Springboard.