2012-09-03 1 views
10

std::u16stringstd::u32string을 C++ 11에서 보았지만 기쁩니다. 왜 UTF-8을 처리 할 std::u8string이 없는지. 나는 std::string이 UTF-8을 대상으로한다는 인상을 받고 있지만 잘하지 못하는 것 같습니다. 무슨 뜻입니까? std::string.length()은 여전히 ​​문자열의 문자 수가 아닌 문자열의 버퍼 크기를 반환하지 않습니까?std :: u16string, std :: u32string, std :: string, length(), size(), 코드 포인트 및 문자

그렇다면 새로운 C++ 11 클래스에 대해 표준 문자열을 정의한 방법은 무엇입니까? 문자열의 버퍼 크기, 코드 포인트 수 또는 문자 수를 반환합니까 (대리 코드 쌍은 2 코드 포인트이지만 한 문자 만 가정하십시오. 제가 틀렸다면 수정하십시오)?

그리고 약 size(); 그것은 length()과 같지 않습니까? 내 혼란의 근원을 알려면 http://en.cppreference.com/w/cpp/string/basic_string/length을 참조하십시오.

그래서, 내 생각, 내 근본적인 문제는 하나 개의 사용 std::string, std::u16string을 수행하고, std::u32string 제대로 버퍼 크기, 코드 포인트의 수, 문자 수를 구별하는 방법이다? 표준 반복기를 사용하는 경우 바이트, 코드 포인트 또는 문자를 반복하고 있습니까?

+3

utf8에서'std :: string'은 utf8에서 utf8과 마찬가지로 작동합니다. utf16에서는 해당 유형의 요소를 처리하며 두 개 이상의 요소 시퀀스로 표현되는 문자는 처리하지 않습니다. –

+0

여기로 이동 : http://utf8everywhere.org/#myth.strlen –

답변

15

u16stringu32string은 "새로운 C++ 11 클래스"가 아닙니다. 그들은 단지 과 cha32_t 타입에 대해 std::basic_string의 typedef 일뿐입니다.

lengthbasic_string에 대해 항상 size과 같습니다. 문자열에 T의 수입니다. 여기서 Tbasic_string의 템플릿 유형입니다.

basic_string은 어떤 식 으로든 모양이나 모양을 유니 코드로 인식하지 못합니다. 코드 포인트, 글자체, 유니 코드 문자, 유니 코드 정규화 또는 그 밖의 어떤 개념도 없습니다. 그것은 단지 T의 순서로 이루어진 시퀀스입니다. u16stringu32string에 대해 유니 코드를 인식하는 유일한 방법은 u""U"" 리터럴에서 반환 한 형식을 사용한다는 것입니다. 따라서 유니 코드로 인코딩 된 문자열을 저장할 수는 있지만 인코딩에 대한 지식이 필요하지는 않습니다.

반복자는 "바이트, 코드 포인트 또는 문자"가 아닌 T의 요소를 반복합니다. Tchar16_t이면 char16_t 초 이상 반복됩니다. 문자열이 UTF-16 인코딩 된 경우 UTF-16 코드 단위를 반복하며 유니 코드 코드 포인트 또는 바이트는 반복하지 않습니다.

+4

유니 코드 용어로 'T'는 "코드 단위"입니다. – dan04

+1

* 코드 단위 *! = * 코드 포인트 *. 두 가지 개념입니다. 내가 그걸 몰랐기 때문에 나중에 참고하기 위해 ... – Eonil

1

모든 문자열 유형은 동일한 작업을 수행합니다. 즉, 문자열 유형의 문자 유형 인 요소 시퀀스를 보유합니다. length()size()은 모두 요소 수를 반환합니다. iterator 요소를 반복자. 문자 수를 계산하는 것과 같은 상위 수준의 분석에는 훨씬 복잡한 계산이 필요합니다.

0

현재 코드 단위, 코드 포인트 또는 개별 바이트를 구별하기 위해 표준에 내장 된 것이 없습니다. 그러나 this sort of thing을 다루는 작업에는 몇 가지가있는 것 같습니다. 표준위원회가 결정한 내용에 따라 TR2 또는 다음 표준의 일부일 수 있습니다.

관련 문제