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*
)를 제공하고 '유니 코드'문자열을 지원할 수있는 방법을 설명해 줄 수 있습니까?
(여기에서 일부 유니 코드 용어가 섞여있을 수 있습니다. 그로 인해 혼란이 생길 수 있습니다.)
감사합니다. 더 명확 해졌지만 여전히 그렇습니다. std :: string을 사용하여 UTF-8 데이터를 이런 방식으로 나타냅니다. 의미 상으로는 잘못되지 않았습니까? 그 문자열의 내용에 의존 할 수는 없을 것입니다. 얼마나 오래 있는지 알 수있는 방법조차 없을 것입니다! (문자 길이로). – Roel
그리고 const char * 버전 인 경우에도 문자열을 안정적으로 사용하려면 다른 라이브러리를 사용해야합니다. – Roel
잘못보다 더 정의되지 않았습니다. std :: string의 메소드 (연결, 반복자 슬라이싱, find_ * 등)는 여전히 작동합니다. length()는 == size()로만 정의됩니다. 오프셋이 문자 경계에 있어야한다는 새로운 전제 조건이 있습니다. std :: string이 인코딩에 대한 약속을했다면 틀릴 것이지만 그렇지 않습니다. – puetzk