2010-06-16 8 views
0

나는 이미이 종류의 질문에 대한 답변을 검색했으며 그 중 많은 내용을 발견했지만 문제의 명백한 사소한 일에 대해서는 여전히 잔인한 의문을 가지고 있습니다.유니 코드 문자 표시

매우 재미있는 주제 인 http://www.joelonsoftware.com/articles/Unicode.html에 대한 유용한 글을 읽었지 만, 유니 코드 데이터 버퍼가있는 경우 개별 글리프를 식별하는 방법에 대해 궁금한 생각이 들었습니다.

내 질문은 :

가 어떻게 유니 코드 문자열을 구문 분석에 대한 갈 것이라고 는, UTF-8라고?

바이트 순서를 알고 있다고 가정하면 6 바이트로 표시되는 글리프 (glyph)가 시작될 때 어떤 일이 발생합니까?

즉, 저장 방법을 올바르게 해석하면 말입니다.

이것은 OpenGL과 함께 작동하도록 설계 한 텍스트 디스플레이 시스템과 관련이 있습니다. 표시 목록에 글리프 데이터를 저장하고 있는데 문자열의 내용을 글리프 인덱스 시퀀스로 변환 한 다음 표시 목록 인덱스에 매핑해야합니다 (그래픽 메모리에 전체 글리프 집합을 저장하는 것이 항상 실용적인).

모든 문자열을 단락 배열로 나타내려면 표시해야하는 모든 것을 고려하여 상당한 양의 저장소가 필요합니다.

또한 문자 당 2 바이트만으로는 가능한 모든 유니 코드 요소를 나타내는 것으로 충분하지 않은 것으로 보입니다.

답변

2

UTF-8과 같이 유니 코드 문자열을 구문 분석하는 방법은 무엇입니까?

"구문 분석"으로, 코드 포인트로 변환한다는 의미입니다.

종종 그렇게 할 필요가 없습니다. 예를 들어, 다른 UTF-8 문자열에서 UTF-8 문자열을 검색 할 수 있습니다.이 문자열은 해당 문자가 나타내는 문자를 신경 쓰지 않아도됩니다.

당신이 다음 코드 포인트 (UTF-32)로 변환해야하는 경우

:

  1. 캐릭터에 얼마나 많은 바이트를 볼 수있는 첫 번째 바이트를 확인합니다.
  2. 문자의 후행 바이트가 80-BF 범위 내에 있는지 확인하십시오. 그렇지 않은 경우 오류를보고하십시오.
  3. 비트 마스킹 및 시프트를 사용하여 바이트를 코드 포인트로 변환합니다.
  4. 가지고있는 바이트 시퀀스가 ​​문자를 나타내는 데 필요한 최소 길이보다 길면 오류를보고하십시오.
  5. 포인터를 시퀀스 길이만큼 증가시키고 다음 문자를 반복하십시오.

또한, 문자 당 2 바이트 단순히 가능한 모든 유니 코드 요소를 표현하는 것만으로는 충분하지 것을 나에게 보인다.

아니야. 유니 코드는 원래 이었으며,은 고정 된 16 비트 인코딩으로 지정했습니다. 나중에 65,536 문자로 충분하지 않으므로 UTF-16이 만들어졌으며 유니 코드는 0에서 1,114,111 사이의 코드 포인트를 사용하도록 재정의되었습니다.

고정 폭 인코딩을 원하면 21 비트가 필요합니다. 하지만 21 비트 정수형을 가진 언어는 많지 않으므로 실제로는 32 비트가 필요합니다.

+0

답장을 보내 주셔서 감사합니다. 필자가 읽은 바에 따르면, UTF-8로 작업해야하는 것으로 보입니다. 바이트 순서에 상관없이 문자열을 반복 할 수 있고 가변 길이 구조처럼 개별 코드 포인트를 어셈블 할 수 있습니다. 왜 wchar_t와 그것의 조작을 둘러싼 끔찍함이 처음에는 그렇게 훌륭한 아이디어인지 궁금합니다. – defube

+0

'wchar_t'는 어떤 문자라도 저장할 수있을 정도로 커야합니다. 따라서 조작이 쉬워지고 어렵지 않습니다. 'wchar_t * '를 한 번 증가시켜 다음 문자를 얻을 수 있습니다.이 문자는 멀티 바이트 문자열을 가리키는'char *'문자를 가질 때 훨씬 더 어렵습니다. UTF-16 문자열에 대해'wchar_t '를 사용하는 작은 VC++/Windows 버그가 있지만 일반적으로 C++을 비난 할 수는 없습니다. 예를 들어 Linux에서는 UTF-32 일 뿐이며 모든 것이 정상적으로 작동합니다. – MSalters

+0

내가 언급 한 바보 같은 사실은 내가 얼마나 큰지와 바이트 정렬을 추적해야한다는 사실과 예측할 수없는 크기와 저장 공간의 "원자"데이터 유형을 처리 할 수있는 디자인 코드 (" 바이트 "대"문자 "). UTF-8은 반복하기에는 짜증나지만 내 의도는 저장 용으로 사용하는 것이 었습니다. 컴파일러가 무엇이든 wchar_t가 UTF-32 인 경우, 바이트 순서의 자극과 부적절 함에도 불구하고 "휴대용"직렬화 코드를 표시하기가 훨씬 쉽습니다. – defube