การกลับข้อความ Unicode นั้นยุ่งยากด้วยเหตุผลหลายประการ
ขั้นแรกขึ้นอยู่กับภาษาการเขียนโปรแกรมสตริงจะแสดงในรูปแบบต่างๆไม่ว่าจะเป็นรายการไบต์รายการหน่วยรหัส UTF-16 (กว้าง 16 บิตมักเรียกว่า "อักขระ" ใน API) หรือเป็นจุดรหัส ucs4 (กว้าง 4 ไบต์)
ประการที่สอง API ที่แตกต่างกันสะท้อนให้เห็นถึงการเป็นตัวแทนภายในในระดับต่างๆ บางส่วนทำงานกับสิ่งที่เป็นนามธรรมของไบต์บางตัวใช้อักขระ UTF-16 บางตัวใช้จุดโค้ด เมื่อการแทนค่าใช้ไบต์หรืออักขระ UTF-16 มักจะมีส่วนของ API ที่ให้คุณเข้าถึงองค์ประกอบของการแสดงนี้รวมถึงส่วนที่ดำเนินการตรรกะที่จำเป็นเพื่อรับจากไบต์ (ผ่าน UTF-8) หรือ UTF-16 อักขระไปยังจุดรหัสจริง
บ่อยครั้งที่ส่วนต่างๆของ API ที่ใช้ตรรกะนั้นและทำให้คุณสามารถเข้าถึงจุดรหัสนั้นได้ถูกเพิ่มเข้ามาในภายหลังเนื่องจากตอนแรกมี ascii 7 บิตจากนั้นอีกเล็กน้อยต่อมาทุกคนคิดว่า 8 บิตเพียงพอแล้วโดยใช้หน้าโค้ดที่แตกต่างกันและแม้กระทั่ง หลังจากนั้น 16 บิตก็เพียงพอสำหรับ Unicode แนวคิดของจุดรหัสเป็นตัวเลขจำนวนเต็มโดยไม่มีขีด จำกัด บนคงที่ในอดีตถูกเพิ่มเป็นความยาวอักขระทั่วไปที่สี่สำหรับการเข้ารหัสข้อความเชิงตรรกะ
การใช้ API ที่ช่วยให้คุณเข้าถึงจุดรหัสจริงดูเหมือนจะเป็นเช่นนั้น แต่...
ประการที่สามมีจุดรหัสปรับเปลี่ยนจำนวนมากที่ส่งผลต่อจุดรหัสถัดไปหรือจุดรหัสต่อไป เช่นมีตัวปรับเสียงที่เปลี่ยน a ต่อไปนี้เป็นä, e ถึงë, & c หมุนจุดรหัสไปรอบ ๆ และกลายเป็นeäซึ่งทำจากตัวอักษรที่แตกต่างกัน มีการแทนค่าโดยตรงของเช่นäเป็นจุดรหัสของตัวเอง แต่การใช้ตัวปรับเปลี่ยนก็ใช้ได้เช่นกัน
ประการที่สี่ทุกอย่างอยู่ในกระแสคงที่ นอกจากนี้ยังมีตัวปรับแต่งมากมายในอีโมจิดังที่ใช้ในตัวอย่างและมีการเพิ่มตัวปรับแต่งเพิ่มเติมทุกปี ดังนั้นหาก API ให้คุณเข้าถึงข้อมูลว่าจุดโค้ดเป็นตัวปรับแต่งหรือไม่เวอร์ชันของ API จะเป็นตัวกำหนดว่ามันรู้จักตัวแก้ไขใหม่ที่เฉพาะเจาะจง
Unicode มีเคล็ดลับแฮ็กแม้ว่าจะเป็นเรื่องเกี่ยวกับรูปลักษณ์ภายนอกเท่านั้น:
มีการเขียนตัวปรับทิศทาง ในกรณีของตัวอย่างจะใช้ทิศทางการเขียนแบบซ้ายไปขวา เพียงเพิ่มตัวปรับทิศทางการเขียนจากขวาไปซ้ายที่จุดเริ่มต้นของข้อความและขึ้นอยู่กับเวอร์ชันของ API / เบราว์เซอร์มันจะมีลักษณะย้อนกลับอย่างถูกต้อง😎
"\ u202e" เรียกว่าการแทนที่จากขวาไปซ้ายซึ่งเป็นรุ่นที่แข็งแกร่งที่สุดของเครื่องหมายจากขวาไปซ้าย
ดูคำอธิบายนี้โดย 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>