Apple đã gặp phải một lỗi trong vài tháng. Giờ đây, chúng tôi đã gặp phải một lỗi nghiêm trọng mới trong chức năng kết xuất văn bản trong iPhone. Lỗi được kích hoạt bởi một ký tự Telugu duy nhất có thể khiến iPhone đi vào vòng lặp khởi động không thể phá vỡ chỉ bằng cách nhận được thông báo có ký tự đó. Hãy cùng tìm hiểu lý do tại sao một ký tự đơn lẻ có thể gây ra các vấn đề nghiêm trọng như vậy với iOS.
Lưu ý: Bản sửa lỗi Telugu hiện có trong phiên bản iOS mới nhất (11.2.6). Nếu nhân vật Telugu đã khóa ứng dụng hoặc thiết bị của bạn, hãy khôi phục iPhone của bạn qua iTunes và cập nhật lên phiên bản iOS mới nhất. Nếu iPhone của bạn bị mắc kẹt trong vòng lặp khởi động, bạn có thể cần đặt nó ở trạng thái Cập nhật chương trình cơ sở thiết bị (DFU) để iTunes nhận ra nó. Khi hoàn tất, hãy khôi phục thiết bị của bạn từ bản sao lưu gần đây 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 ở nhiều vùng của Ấn Độ, đặc biệt là các bang Andhra Pradesh, Telangana và ở thị trấn Yanam. Giống như nhiều ngôn ngữ dựa trên hệ thống chữ viết, chẳng hạn như tiếng Ả Rập và các chữ viết 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 thị bằng điểm mã Unicode 8 bit duy nhất để tương thích với ASCII (ví dụ:chữ cái A tồn tại ở điểm mã Unicode U+0041
, được biểu diễn dưới dạng nhị phân bởi 01000001
), các ngôn ngữ được viết bằng script hoặc các chữ cái không phải chữ Latinh thường kết hợp nhiều hơn một điểm mã Unicode để biểu thị các ký tự của chúng.
Điều này đặc biệt đúng đối với các ngôn ngữ, chẳng hạn như tiếng Telugu, kết hợp các phiên bản chữ cái của ngôn ngữ trong các cụm. Không giống như cách ghép chữ theo kiểu của tiếng Anh, mối liên hệ giữa mỗi chữ cái Telugu rất quan trọng về mặt ngôn ngữ. Để đáp ứng điều này, Unicode bao gồm một hệ thống phức tạp gồm các ký tự đính kèm, mỗi ký tự được biểu thị bằng điểm mã riêng của chúng, với nhau.
Xem xét số lượng điểm mã Unicode tuyệt đối, điều này có thể tạo ra sự đa dạng gần như vô hạn. Những điểm này kết hợp với nhau để tạo ra một ký tự dễ đọc. Bằng cách này, Unicode không cần điểm mã Unicode cho mọi từ Telugu có thể có theo đúng nghĩa đen. Thay vào đó, Unicode kết hợp các phụ âm, nguyên âm và dấu phụ tiếng Telugu (“virama”) với nhau để tạo ra các từ được hiển thị giống như một ký tự duy nhất. Điều tương tự cũng áp dụng cho các ngôn ngữ khác có các quy tắc chính thống cho chữ ghép, như tiếng Ả Rập.
Nguyên nhân nào gây ra sự cố?
Sự cố dường như liên quan đến Bộ kết hợp không có độ rộng bằng không (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ó chữ ghép thông thường của chúng. Trong tiếng Anh, ZWNJ giữ cho các ký tự ff không được in bằng chữ ghép nối chuẩn của chúng, thay vào đó phân tách từng f. Nhưng khi được kết hợp với một bộ bốn điểm mã Telugu cụ thể (tất cả chúng sẽ kết hợp thành một cụm duy nhất), vì một số lý do, iOS không thể hiển thị kết quả chính xác.
Một số người đã suy đoán rằng phông chữ San Francisco của Apple không thể hiển thị ký tự, trong khi những người khác lại nói rằng quy trình kết xuất cụ thể mà Apple sử dụng là nguyên nhân. Cho dù nguyên nhân chính xác là gì, nỗ lực kết xuất nhân vật gây ra sự cố đáng kể cho bất cứ thứ gì đang hiển thị nó, từ Tin nhắn và WhatsApp đến Springboard. Các điểm mã Unicode tạo nên ký tự (“gya” có nghĩa là “kiến thức”) bên dưới:
-
U+0C1C
ja ( ) -
U+0C4D
một virama, hoặc dấu phụ ( ) -
U+0C1E
nya ( ) -
U+200C
các ký tự không nối với chiều rộng bằng không -
U+0C3E
aa ( )
Nhưng chúng tôi thậm chí không thể đổ lỗi cho Zero Width Non-Joiner (ZWNJ) một mình. Nó cũng được sử dụng trong các biểu tượng cảm xúc gia đình vô thưởng vô phạt (????) Mà không gặp bất kỳ vấn đề gì. Nó dường như là sự kết hợp cụ thể của một số điểm mã cụ thể và ZWNJ. Thêm sự xúc phạm đến chấn thương, có vẻ như ZWNJ không có tác dụng cụ thể nào đối với việc hiển thị trên cụm Telugu này hoặc thậm chí nó sẽ không có ở đó ngay từ đầu.
Các vấn đề khác về tập lệnh Brahmic
Tuy nhiên, Telugu không phải là ngôn ngữ duy nhất có vấn đề này. Tiếng Bengali và Devanagari, sử dụng Unicode theo cách tương tự cho các chữ viết Brahmic của họ, cũng gặp phải vấn đề tương tự. Manish Goregaokar viết một bài đăng trên blog đầy đủ và chi tiết giúp phá vỡ trường hợp tai nạn chính xác hơn nữa:
Bất kỳ chuỗi nào
<consonant1, virama, consonant2, ZWNJ, vowel>
ở Devanagari, Bengali và Telugu, nơi:1.
consonant2
là nối hậu tố (pstf
/vatu
)
2.consonant1
không phải là một chữ cái định hình
3.vowel
không có hai thành phần glyph
Kết luận:Tại sao điều này không được Apple bắt?
Để hiểu lỗi này đã vượt qua như thế nào, 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 số từ khó hiểu trong ngôn ngữ Telugu. Nhưng iPhone hỗ trợ hàng chục ngôn ngữ. Thực sự có hàng tỷ tổ hợp tiềm năng trong Unicode. Với sự đa dạng đó, việc kiểm tra các lỗi Unicode có ý nghĩa trước khi phát hành sẽ khiến các bản cập nhật phần mềm thường xuyên về cơ bản là không thể.
Tuy nhiên, lỗi đáng lẽ không gây ra thiệt hại lớn như thế này. Điện thoại sẽ không được xếp gạch dựa trên nội dung của một tin nhắn văn bản. Mặc dù nhận thức muộn màng chắc chắn là 20/20, nhưng có vẻ như việc hiển thị nhân vật dưới dạng một hộp dấu chấm hỏi (�) sẽ tốt hơn việc làm hỏng Springboard.