2016-07-19 2 views
0

기본 다국어 평면에없는 코드 포인트를 이스케이프 처리하려면 문자가 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"으로 인코딩하지 않아야합니다. 왜 이런거야?

+1

히스테릭 건포도 용. 죄송합니다. 역사적인 이유 :-) 그렇습니다. 유니 코드 포인트를 직접 사용하거나 인코딩 된 서로 게이트 쌍을 사용할 수 있습니다. – gnasher729

+1

'\ u' 이스케이프 형식은 4 자리 16 진수로 제한되므로 16 비트 값만 인코딩 할 수 있습니다. 0x1D11E는 16 비트에 맞지 않으므로 서로 게이트 쌍을 사용합니다. 이것은 당시의 모든 유니 코드 코드 포인트가 16 비트에 잘 맞을 때 UCS-2 시대로 거슬러 올라갑니다. 유니 코드가 16 비트를 능가하면 UTF-16이 인코딩 제한을 초과하도록 발명되었지만 기존 UCS-2 데이터 및 형식과 역 호환이 가능해야합니다. –

+0

''\ u1d11e ''를'' "'"을 의미하도록 지원하면''ᴑe "'문자열을'ᴑ'에'\ u1d11'을 사용하여 인코딩하는 것을 어렵게 만듭니다. 가장 좋은 질문은 '\ U0001d11e''와 같은 시퀀스에 대한 지원이 언어에 추가되지 않은 이유입니다 (예 : Python 및 C++). –

답변

2

JSON의 핵심 아키텍처 기능 중 하나는 JSON 인코딩 객체가 예를 들어 eval 함수를 사용하여 평가할 수있는 유효한 자바 스크립트 리터럴이라는 것입니다. 유감스럽게도 이전 Javascript 구현은 문자열 리터럴에 4 개의 16 진수 문자가있는 16 비트 유니 코드 이스케이프 시퀀스 만 지원하므로 이동식으로 0xFFFF 이상의 코드 포인트에 대해 이스케이프 시퀀스에서 UTF-16 서로 게이트를 사용하는 것 외에 다른 방법은 없습니다. (\u{...} 임의의 코드 포인트를 허용하는 구문은 ECMAScript 6에서만 도입되었습니다.)

그러나 언급 한대로 응용 프로그램이 유니 코드 JSON 텍스트를 지원하는 경우 이스케이프 시퀀스를 사용할 필요가 없습니다. 문자를 각각의 유니 코드 형식으로 직접 인코딩하면됩니다.

관련 문제