2008-09-28 17 views
12

XML 파일을 구문 분석/작성하기 위해 TinyXML을 사용하고 있습니다. 이제 the documentation에 따르면이 라이브러리는 UTF-8을 통해 멀티 바이트 문자 집합을 지원합니다. 지금까지 그렇게 좋은 생각입니다. 그러나 라이브러리가 제공하는 유일한 API (요소 이름, 속성 이름 및 값 가져 오기/설정, 문자열이 사용되는 모든 항목)는 std::string 또는 const char*입니다. 이것은 멀티 바이트 문자 세트 지원에 대한 내 자신의 이해를 의심스럽게합니다. 8 비트 문자 만 지원하는 문자열은 코드 페이지를 사용하지 않는 한 어떻게 16 비트 문자를 포함 할 수 있습니까? 이는 '유니 코드 지원'주장을 무효화 할 수 있습니까? 이론적으로 16 비트 코드 포인트를 사용하여 std::string에서 2 문자 이상으로 나눌 수 있지만 std::string을 '유니 코드'문자열로 변환하지 않는다면 대부분의 경우 유효하지 않게되고 우연히 발생합니다. 파일에 쓰고 다른 프로그램에서 읽을 때 작동합니다.TinyXML의 UTF-8 지원은 어떻게 작동합니까?

그럼 라이브러리에서 '8 비트 인터페이스'(std::string 또는 const char*)를 제공하고 '유니 코드'문자열을 지원할 수있는 방법을 설명해 줄 수 있습니까?

(여기에서 일부 유니 코드 용어가 섞여있을 수 있습니다. 그로 인해 혼란이 생길 ​​수 있습니다.)

답변

8

먼저 utf-8은 @quinmars가 말한 것처럼 const char * 문자열에 저장됩니다. 그리고 7 비트 ASCII (코드 포인트 < = 127은 항상 단일 바이트로 인코딩 됨)의 상위 집합 일뿐만 아니라 코드 포인트에 대한 멀티 바이트 값 인코딩의 일부로 이러한 값을 가진 바이트가 절대로 사용되지 않도록주의해야합니다 > = 128입니다. 따라서 바이트 == 44를 보면 '<'문자입니다. XML의 모든 메타 문자는 7 비트 ASCII입니다. 그래서 XML을 파싱 할 수 있습니다. 메타 문자가있는 곳에서 문자열을 파기 할 수 있습니다. 단, 비 ASCII 문자를 포함한 파편을 char * 또는 std :: string으로 고정하고 반환 된 조각은 유효한 UTF-8 문자열로 유지됩니다. 파서는 특별히 UTF-8을 알지 못했습니다.

(XML에만 국한되지 않고 오히려 영리 함), 훨씬 복잡한 작업도 genrally just work (tm)입니다. 예를 들어 바이트 단위로 UTF-8을 사전 순으로 정렬하는 경우 사용되는 바이트 수의 차이에도 불구하고 코드 포인트에 의해 사전 식으로 정렬하는 것과 동일한 대답을 얻습니다. 접두사 바이트가 더 긴 (따라서 더 높은 값의) 코드를 도입하기 때문입니다 점은 더 작은 값의 경우보다 수치 적으로 더 큽니다).

+0

감사합니다. 더 명확 해졌지만 여전히 그렇습니다. std :: string을 사용하여 UTF-8 데이터를 이런 방식으로 나타냅니다. 의미 상으로는 잘못되지 않았습니까? 그 문자열의 내용에 의존 할 수는 없을 것입니다. 얼마나 오래 있는지 알 수있는 방법조차 없을 것입니다! (문자 길이로). – Roel

+0

그리고 const char * 버전 인 경우에도 문자열을 안정적으로 사용하려면 다른 라이브러리를 사용해야합니다. – Roel

+2

잘못보다 더 정의되지 않았습니다. std :: string의 메소드 (연결, 반복자 슬라이싱, find_ * 등)는 여전히 작동합니다. length()는 == size()로만 정의됩니다. 오프셋이 문자 경계에 있어야한다는 새로운 전제 조건이 있습니다. std :: string이 인코딩에 대한 약속을했다면 틀릴 것이지만 그렇지 않습니다. – puetzk

2

UTF-8은 7 비트 ASCII 코드와 호환됩니다. 한 바이트의 값이 127보다 크면 멀티 바이트 문자가 시작됨을 의미합니다. 첫 번째 바이트의 값에 따라 문자가 차지하는 바이트 수를 알 수 있습니다. 첫 번째 바이트를 포함하여 2-4 바이트가 될 수 있습니다 (기술적 인 5 또는 6도 가능하지만 utf-8은 유효하지 않습니다). 다음은 UTF-8에 관한 훌륭한 자료입니다 : UTF-8 and Unicode FAQ, utf8의 위키 페이지도 매우 유익합니다. UTF-8은 char 기반이며 0으로 종료되므로 대부분의 경우 표준 문자열 함수를 사용할 수 있습니다. 유일한 중요한 점은 문자 수는 바이트 수와 다를 수 있다는 것입니다. strlen()과 같은 함수는 바이트 수를 반환하지만 반드시 문자 수는 아닙니다.

0

하나의 유니 코드 코드 포인트를 인코딩하는 데 1에서 4 개의 문자를 사용합니다.