문제

사용 중입니다 tinyxml XML 파일을 구문 분석/빌드합니다. 이제,에 따르면 문서 이 라이브러리는 UTF-8을 통해 멀티 바이트 문자 세트를 지원합니다. 지금까지 너무 좋아요. 그러나 라이브러리가 제공하는 유일한 API (요소 이름, 속성 이름 및 값을 설정하기위한 것, 문자열이 사용되는 모든 것) std::string 또는 const char*. 이것은 멀티 바이트 캐릭터 세트 지원에 대한 내 자신의 이해를 의심합니다. 8 비트 문자 만 지원하는 문자열에는 16 비트 문자가 어떻게 포함될 수 있습니까 (코드 페이지를 사용하지 않는 한 'supports unicode'주장을 무효화 할 수 없음)? 이론적으로 16 비트 코드 포인트를 가져 와서 2 숯으로 나눌 수 있다는 것을 이해합니다. std::string, 그러나 그것은 변형되지 않을 것입니다 std::string '유니 코드'문자열로, 그것은 대부분의 목적으로 유효하지 않으며 파일에 작성하고 다른 프로그램에서 읽을 때 실수로 작동 할 수 있습니다.

그래서 누군가 도서관이 어떻게 '8 비트 인터페이스'를 제공 할 수 있는지 설명 할 수 있습니까?std::string 또는 const char*) 그리고 여전히 '유니 코드'문자열을 지원합니까?

(아마도 여기서 유니 코드 용어를 혼합했을 것입니다. 그로부터 나오는 혼란에 대해 죄송합니다).

도움이 되었습니까?

해결책

첫째, UTF-8은 @Quinmars가 말한 것처럼 Const Char * 문자열에 저장됩니다. 그리고 그것은 7 비트 ASCII (코드 포인트 <= 127이 항상 단일 바이트로 인코딩 된 코드 포인트 <= 127) 일뿐 만 아니라, 해당 값의 바이트가 코드 포인트에 대한 멀티 파드 값의 인코딩의 일부로 사용되지 않도록주의합니다. > = 128. 따라서 바이트 == 44가 보이면 '<'문자 등입니다. XML의 모든 메타 다르는 7 비트 ASCII입니다. 따라서 XML을 구문 분석하고 Metachars가 말하는 문자열을 깨뜨릴 수 있으며 조각 (아마도 비 ASCII 숯 포함)을 숯 * 또는 std :: string에 붙이고 반환 된 조각은 유효한 UTF-8 줄을 유지합니다. Parser는 구체적으로 UTF-8을 알지 못했습니다.

더 나아가 (XML에만 국한되지 않고 영리한), 더 복잡한 것들이 장르에서 작동합니다 (TM). 예를 들어, 바이트별로 UTF-8 사전 어휘를 정렬하면 사용 된 바이트의 변동에도 불구하고 코드 포인트별로 사전에 정렬하는 것과 동일한 답변을 얻을 수 있습니다. 포인트는 더 적은 값에 대한 점보다 수치 적으로 큽니다).

다른 팁

UTF-8은 7 비트 ASCII 코드와 호환됩니다. 바이트의 값이 127보다 크면 멀티 바이트 문자가 시작됩니다. 첫 번째 바이트의 값에 따라 문자가 취할 수있는 바이트 수를 알 수 있습니다. 첫 바이트를 포함하여 2-4 바이트가 될 수 있습니다 (기술도 5 또는 6도 가능하지만 유효한 UTF-8은 아닙니다). UTF-8에 대한 좋은 자료는 다음과 같습니다. UTF-8 및 유니 코드 FAQ, 또한 UTF8의 Wiki 페이지는 매우 유익합니다. UTF-8은 Char 기반이고 0이 종료되므로 대부분의 경우 표준 문자열 함수를 사용할 수 있습니다. 유일한 중요한 것은 문자 수가 바이트 수와 다를 수 있다는 것입니다. strlen ()과 같은 함수는 바이트 수를 반환하지만 반드시 문자 수는 아닙니다.

1 ~ 4 숯을 사용하여 하나의 유니 코드 코드 포인트를 인코딩합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top