기본 다국어 평면에없는 코드 포인트를 이스케이프 처리하려면 문자가 UTF-16 서로 게이트 쌍을 인코딩하는 12 문자 시퀀스로 표시됩니다. 예를 들어, G 음자리표 문자 (U + 1D11E) 만 포함하는 문자열은
"\uD834\uDD1E"
으로 표시 될 수 있습니다.JSON이 유니 코드 코드 포인트 대신 UTF-16 서로 게이트 쌍을 직접 인코딩하는 이유는 무엇입니까?
ECMA-404 : The JSON Data Interchange Format
내가 there is no need to encode this character at all, 그래서이 ""
로 직접 표현 될 수 있다고 생각합니다. 그러나 인코딩하려는 경우 사양에 따라 "\uD834\uDD1E"
으로 인코딩해야하며 "\u1d11e"
으로 인코딩하지 않아야합니다. 왜 이런거야?
히스테릭 건포도 용. 죄송합니다. 역사적인 이유 :-) 그렇습니다. 유니 코드 포인트를 직접 사용하거나 인코딩 된 서로 게이트 쌍을 사용할 수 있습니다. – gnasher729
'\ u' 이스케이프 형식은 4 자리 16 진수로 제한되므로 16 비트 값만 인코딩 할 수 있습니다. 0x1D11E는 16 비트에 맞지 않으므로 서로 게이트 쌍을 사용합니다. 이것은 당시의 모든 유니 코드 코드 포인트가 16 비트에 잘 맞을 때 UCS-2 시대로 거슬러 올라갑니다. 유니 코드가 16 비트를 능가하면 UTF-16이 인코딩 제한을 초과하도록 발명되었지만 기존 UCS-2 데이터 및 형식과 역 호환이 가능해야합니다. –
''\ u1d11e ''를'' "'"을 의미하도록 지원하면''ᴑe "'문자열을'ᴑ'에'\ u1d11'을 사용하여 인코딩하는 것을 어렵게 만듭니다. 가장 좋은 질문은 '\ U0001d11e''와 같은 시퀀스에 대한 지원이 언어에 추가되지 않은 이유입니다 (예 : Python 및 C++). –