유니 코드 텍스트를 뒤집는 것은 여러 가지 이유로 까다 롭습니다.
첫째, 프로그래밍 언어에 따라 문자열은 바이트 목록, UTF-16 코드 단위 목록 (16 비트 너비, API에서 "문자"라고도 함) 또는 ucs4 코드 포인트로 다른 방식으로 표현됩니다. (4 바이트 너비).
둘째, 다른 API는 내부 표현을 다른 각도로 반영합니다. 일부는 바이트 추상화, 일부는 UTF-16 문자, 일부는 코드 포인트에서 작업합니다. 표현이 바이트 또는 UTF-16 문자를 사용하는 경우 일반적으로이 표현의 요소에 대한 액세스를 제공하는 API 부분과 바이트 (UTF-8을 통해)에서 가져 오는 데 필요한 논리를 수행하는 부분이 있습니다. 실제 코드 포인트에 대한 UTF-16 문자.
종종 해당 로직을 수행하고 따라서 코드 포인트에 대한 액세스를 제공하는 API 부분이 나중에 추가되었습니다. 처음에는 7 비트 ASCII가 있었고 조금 후에 모두가 다른 코드 페이지를 사용하여 8 비트로 충분하다고 생각했습니다. 나중에는 16 비트가 유니 코드로 충분했습니다. 고정 된 상한이없는 정수로 코드 포인트의 개념은 역사적으로 텍스트를 논리적으로 인코딩하기위한 네 번째 공통 문자 길이로 추가되었습니다.
실제 코드 포인트에 대한 액세스를 제공하는 API를 사용하는 것은 그게 다인 것 같습니다. 그러나...
셋째, 다음 코드 포인트 또는 다음 코드 포인트에 영향을 미치는 수정 자 코드 포인트가 많이 있습니다. 예를 들어 a를 ä, e에서 ë, & c로 바꾸는 분음 부호 수식어가 있습니다. 코드 포인트를 돌리면 aë는 다른 문자로 만들어진 eä가됩니다. 예를 들어 ä를 자체 코드 포인트로 직접 표현하지만 수정자를 사용하는 것도 똑같이 유효합니다.
넷째, 모든 것이 지속적으로 유동적입니다. 예에서 사용 된 것처럼 이모 지에는 많은 수정자가 있으며 매년 더 많이 추가됩니다. 따라서 API가 코드 포인트가 수정 자인지 여부에 대한 정보에 대한 액세스를 제공하는 경우 API 버전은 특정 새 수정자를 이미 알고 있는지 여부를 결정합니다.
하지만 유니 코드는 시각적 인 모양에 관한 문제 일 때 해키 트릭을 제공합니다.
쓰기 방향 수정자가 있습니다. 예제의 경우 왼쪽에서 오른쪽 쓰기 방향이 사용됩니다. 텍스트 시작 부분에 오른쪽에서 왼쪽 쓰기 방향 수정자를 추가하고 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>