2011-05-05 4 views
107

StringBuffer, 특히 reverse() 방법에 대한 설명서를 읽었습니다. 해당 설명서에는 대리 쌍에 대한 내용이 나와 있습니다. 이 문맥에서 서로 게이트 쌍은 무엇입니까? 은 무엇입니까? 대리모가 무엇입니까?Java에서 "서로 게이트 쌍"이란 무엇입니까?

+1

UTF-16 용어입니다. http://download.oracle.com/javase/6/docs/api/java/lang/Character.html#unicode – birryree

+0

이 방법은 버그가 있습니다 : 전체 문자를 역으로 사용해야합니다 ᴀᴋᴀ 코드 포인트 - ᴀᴋᴀ 코드 단위가 아닙니다. 버그는 특정 레거시 메서드가 코드 포인트가 아닌 개별 문자 단위에서만 작동한다는 것입니다. 코드 단위는 char 단위가 아닌 * String 형식으로 이루어져야합니다. Java가 너무 좋지 않으므로이를 수정하기 위해 객체 지향을 사용할 수 없지만 'String' 클래스와'StringBuffer' 클래스는 모두 finalize되어 있습니다. 살인 완곡 어법이지 않니? :) – tchrist

+2

@tchrist 문서 (및 소스)는 코드 포인트 문자열로 역순으로 처리한다고 말합니다. (아마 1.0.2는 그런 일을하지 않았고, 요즘 같은 행동 변화를 결코 겪지 않을 것입니다.) –

답변

88

"서로 게이트 쌍"이란 용어는 UTF-16 인코딩 체계에서 높은 코드 포인트로 유니 코드 문자를 인코딩하는 방법을 나타냅니다.

유니 코드 문자 인코딩에서 문자는 0x0에서 0x10FFFF 사이의 값으로 매핑됩니다.

내부적으로 Java는 UTF-16 인코딩 체계를 사용하여 유니 코드 텍스트 문자열을 저장합니다. UTF-16에서는 16 비트 (2 바이트) 코드 단위가 사용됩니다. 16 비트는 0x0에서 0xFFFF까지의 문자 범위 만 포함 할 수 있기 때문에이 범위 (0x10000에서 0x10FFFF) 이상의 값을 저장하는 데 약간의 추가 복잡성이 사용됩니다. 이 작업은 서로 게이트라고하는 코드 단위 쌍을 사용하여 수행됩니다.

서로 게이트 코드 단위는 두 코드 단위 시퀀스의 시작 또는 끝 부분에서 허용되는지에 따라 "높은 대리"및 "낮은 대리"로 알려진 두 범위에 있습니다.

6

대리 쌍, 무슨 문서가 말하고있는 것은 그들이의 반전 될 수 있기 때문에 잘못된 UTF-16 문자열이 reverse 방법을 호출 한 후 유효가 될 수 있다는 것이다 http://en.wikipedia.org/wiki/UTF-16/UCS-2#Code_points_U.2B10000..U.2B10FFFF

+8

"캐릭터"는로드 된 용어입니다. – Triynko

+1

유니 코드에는 문자가 없지만 코드 포인트가 있습니다. 각 코드 점은 0에서 여러 문자로 렌더링 할 수 있습니다. –

22

참조 특정 문자 인코딩 UTF-16의 방법을 의미 유효한 문자열. 서로 게이트 쌍 (논의 됨 here)은 단일 유니 코드 코드 포인트를 인코딩하는 UTF-16의 16 비트 값 쌍입니다. 저수준 및 고수준 대리모는 인코딩의 두 부분입니다.

+6

설명. 문자열은 "참"문자 (a.k.a "graphemes"또는 "텍스트 요소")에서 반대로 표시해야합니다. 단일 "문자"코드 포인트는 하나 또는 두 개의 "char"청크 (서로 게이트 쌍) 일 수 있으며, 하나 이상의 문자 코드 (즉, 기본 문자 코드와 하나 이상의 결합 문자 코드)가 될 수 있습니다. 하나 또는 두 개의 16 비트 청크 또는 "chars"long)이 될 수 있습니다. 따라서 하나의 글씨체는 길이가 각각 "chars"이고 길이가 6자인 총 3 개의 문자를 결합 할 수 있습니다. 전체 6 자 "문자"는 전체 문자열을 뒤집을 때 순서대로 (즉, 뒤집지 않아야 함) 함께 보관해야합니다. – Triynko

+4

따라서 "char"데이터 형식은 오해의 소지가 있습니다. "성격"은 느슨한 용어입니다. "char"유형은 실제로 UTF16 청크 크기이며 우리는 사로 게이트 쌍의 상대적인 희귀성 때문에 문자를 호출합니다 (즉, 일반적으로 전체 문자 코드 포인트를 나타냄). 따라서 "문자"는 실제로 단일 유니 코드 코드 포인트를 나타냅니다 , 그러나 결합 문자를 사용하면 단일 "문자/문자 또는 텍스트 요소"로 표시되는 일련의 문자를 가질 수 있습니다. 이것은 로켓 과학이 아닙니다. 개념은 간단하지만 언어가 혼란 스럽습니다. – Triynko

+0

자바가 개발 될 당시 유니 코드는 초기 단계였습니다. 자바는 유니 코드가 서로 게이트 쌍을 갖기 전에 약 5 년 동안 있었기 때문에 16 비트 문자는 당시에 꽤 잘 맞았다. 이제는 UTF-8 및 UTF-32를 사용하는 것이 UTF-16보다 훨씬 낫습니다. –

1

서로 게이트 쌍은 하나의 '코드 포인트'를 구성하는 UTF-16의 두 '코드 단위'입니다. Java 문서에서는 이러한 '코드 포인트'가 올바른 순서로 '코드 단위'로 올바르게 나열된다는 사실을 알립니다. 또한, 2 개의 대응되지 않은 대리 코드 단위가 역전되어 유효한 대리 쌍을 형성 할 수 있다고 기술되어있다. 즉, 페어링되지 않은 코드 단위가있는 경우 리버스의 역이 동일하지 않을 가능성이 있습니다!

그래도 설명서에는 여러 코드 포인트가 결합 된 Graphemes에 대한 설명이 없습니다. 즉, e와 함께가는 악센트가 계속 전환 될 수 있으므로 e 앞에 악센트가 배치됩니다. 즉, e 앞에 다른 모음이 있으면 e에있는 악센트를 얻을 수 있습니다.

Yikes!

5

초기 Java 버전은 16 비트 char 데이터 형식을 사용하는 유니 코드 문자를 나타냅니다. 모든 유니 코드 문자는 65,535 (0xFFFF)보다 작은 값을 가지며 16 비트로 표현 될 수 있기 때문에이 디자인은 당시로서는 의미가있었습니다. 그러나 나중에 유니 코드는 최대 값을 1,114,111 (0x10FFFF)까지 증가 시켰습니다. 16 비트 값이 유니 코드 버전 3.1의 모든 유니 코드 문자를 나타 내기에는 너무 작기 때문에 코드 포인트라고하는 32 비트 값이 UTF-32 인코딩 체계에 채택되었습니다. 효율적인 메모리 사용을 위해 16 비트 값이 32 비트 값보다 우선하므로 유니 코드는 16 비트 값을 계속 사용할 수 있도록 새로운 디자인을 도입했습니다. UTF-16 인코딩 체계에서 채택 된이 디자인은 16 비트 상위 사로 게이트 (U + D800에서 U + DBFF까지)에 1,024 개의 값을 할당하고 다른 1,024 개의 값에서 16 비트 낮은 사로 게이트 (U + DC00 ~ U + DFFF). 상위 대리모 다음에 낮은 대리인 - 대리 쌍 -을 사용하여 65536 (0x10000)에서 1,114,111 (0x10FFFF) 사이의 1,048,576 (0x100000) 값을 나타냅니다 (1,024 및 1,024의 곱).

+0

필자는 유니 코드 3.1이 1024 * 1024의 새로운 값을 얻기 위해 원래 65535에서 1024 + 1024 (높은 값 + 낮은 값) 값을 예약 한 방법을 설명하고 있으므로 파서가 처음부터 문자열. –