Đảo ngược văn bản Unicode rất khó vì nhiều lý do.
Đầu tiên, tùy thuộc vào ngôn ngữ lập trình, các chuỗi được biểu diễn theo các cách khác nhau, hoặc dưới dạng danh sách byte, danh sách các đơn vị mã UTF-16 (rộng 16 bit, thường được gọi là "ký tự" trong API) hoặc dưới dạng điểm mã ucs4 (Rộng 4 byte).
Thứ hai, các API khác nhau phản ánh sự thể hiện bên trong đó ở các mức độ khác nhau. Một số hoạt động dựa trên sự trừu tượng của byte, một số dựa trên ký tự UTF-16, một số dựa trên các điểm mã. Khi biểu diễn sử dụng byte hoặc ký tự UTF-16, thường có các phần của API cung cấp cho bạn quyền truy cập vào các phần tử của biểu diễn này, cũng như các phần thực hiện logic cần thiết để lấy từ byte (thông qua UTF-8) hoặc từ UTF-16 ký tự cho điểm mã thực tế.
Thông thường, các phần của API thực hiện logic đó và do đó cung cấp cho bạn quyền truy cập vào các điểm mã đã được thêm vào sau đó, vì đầu tiên có 7 bit ascii, sau đó một chút mọi người nghĩ rằng 8 bit là đủ, sử dụng các trang mã khác nhau và thậm chí sau đó 16 bit là đủ cho unicode. Khái niệm về điểm mã là số nguyên không có giới hạn trên cố định đã được thêm vào lịch sử làm độ dài ký tự chung thứ tư để mã hóa văn bản một cách logic.
Sử dụng một API cho phép bạn truy cập vào các điểm mã thực tế có vẻ như vậy. Nhưng...
Thứ ba, có rất nhiều điểm mã bổ trợ ảnh hưởng đến điểm mã tiếp theo hoặc các điểm mã tiếp theo. Ví dụ: có một công cụ sửa đổi dấu phụ chuyển sau a thành ä, e thành ë, & c. Xoay các điểm mã xung quanh và aë trở thành eä, được tạo từ các chữ cái khác nhau. Có một biểu diễn trực tiếp của ví dụ ä như là điểm mã riêng của nó nhưng sử dụng công cụ sửa đổi cũng hợp lệ.
Thứ tư, mọi thứ đều liên tục. Ngoài ra còn có rất nhiều công cụ sửa đổi trong số các biểu tượng cảm xúc, như được sử dụng trong ví dụ và nhiều hơn nữa được thêm vào mỗi năm. Do đó, nếu một API cấp cho bạn quyền truy cập vào thông tin liệu một điểm mã có phải là công cụ sửa đổi hay không, thì phiên bản của API sẽ xác định xem nó đã biết một công cụ sửa đổi mới cụ thể hay chưa.
Tuy nhiên, Unicode cung cấp một thủ thuật hacky khi nó chỉ về hình thức:
Có bổ ngữ hướng viết. Trong trường hợp của ví dụ, hướng viết từ trái sang phải được sử dụng. Chỉ cần thêm công cụ sửa đổi hướng viết từ phải sang trái ở đầu văn bản và tùy thuộc vào phiên bản của API / trình duyệt, nó sẽ được đảo ngược một cách chính xác 😎
'\ u202e' được gọi là ghi đè từ phải sang trái, đây là phiên bản mạnh nhất của điểm đánh dấu từ phải sang trái.
Xem lời giải thích này của w3.org
const text = 'Hello world👩🦰👩👩👦👦'
console.log('\u202e' + text)
const text = 'Hello world👩🦰👩👩👦👦'
let original = document.getElementById('original')
original.appendChild(document.createTextNode(text))
let result = document.getElementById('result')
result.appendChild(document.createTextNode('\u202e' + text))
body {
font-family: sans-serif
}
<p id="original"></p>
<p id="result"></p>