2012-06-25 1 views
3

Windows의 유니 코드 UTF-8 인 MSVC 10에서 코딩해야합니다. UTF-8로 인코딩 된 문자열은 문자 당 1 또는 2 바이트를 사용한다는 것을 알고 있습니다. 그래서, 내 질문은 : std :: string 적합한이 있습니까? 그렇다면 문자열을 어떻게 해독합니까? 늘어나는만큼 내가 이해 표준 : : 문자열은 단지 바이트의 배열이며 어떤 디코딩 로직을 제공하지 않습니다. 문자열의 논리적 길이를 어떻게 알 수 있습니까? 문자열에서 논리적 문자를 추출하려면 어떻게해야합니까? 문자열에서 논리 문자를 추출하는 데 도움이되는 라이브러리가 있습니까?UTF-8 디코딩 라이브러리

예 : 나는 문자열 "올레"표준에 : : 문자열이있는 경우, 나는 길이가 3 인 것을 알 필요가 있지만 4

+6

UTF-8은 하나 또는 두 개가 아닌 문자 당 최대 4 바이트까지 사용할 수 있습니다. – deceze

+1

문자열을 디코딩하면 [정확히] (http://utf8everywhere.org/#faq.glossary) 무엇을 의미합니까? 더 중요한 것은 왜 길이를 알아야합니까? 일반적으로 유니 코드에서는 의미가 없습니다. – ybungalobill

답변

-2

먼저에() 함수 mbstowcs 함수를 호출 할 수 있습니다 UTF-8 문자를 와이드 문자로 변환합니다. 그런 다음 8 비트 결과를 얻으려면 "유니 코드"문자 (ISO-8859-1 평면 이외의 문자, 라틴어 1 문자)가있는 경우 데이터가 손실됩니다.

"Windows"인코딩은 ISO-8859-1과 1 대 1이 아니지만 대부분의 경우 ISO-8859-1은 요즘 사용되는 인코딩입니다.

참조 :) (당신은 단지 문자의 길이를 원하는 경우 mblen은을 사용 http://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs/

좋아요 기능 :

len = mblen(str.c_str(), str.length()); 

추가 참고 : 구현 mblen은 할 수있는 쉬운 방법은() 계산하는 것입니다 그것들은 멀티 바이트 시퀀스의 일부이기 때문에 0x80과 0xBF 사이에없는 바이트 수. 비정상적인 직렬 연결을 통해 UTF-8 바이트 시퀀스를 수신하는 경우 특히 유용합니다.

+0

"대부분의 경우 ISO-8859-1은 사람들이 요즘 사용하는 것입니다." interwebs에서 CP1252가 ISO-8859-1로 잘못 표시되는 것을 자주 보았습니다. 어떤 경우에 "사용"한다고 말할지는 모르겠지만 "대부분의 사람들"이 사용하는 것과 상관없이 중요한 것은 텍스트가 코드를 손상시키는 사람들의 소수입니다 .-) –

+0

그게 전부입니다 OP가 원하는 것이 아닙니다. UTF-16을 무손실로 1 바이트 코드 포인트로 변환하려는 이유는 무엇입니까? 이 질문은 어디서나이를 의미하지는 않습니다. ISO-8859-1 언급은 잘못된 것입니다. "대부분의 경우 사람들이 요즘 사용하는 것은 완전히 잘못되었습니다. 사실 현대의 브라우저는 명시 적으로이 인코딩을 명시 적으로 요구하더라도 ISO-8859-1을 의미하는 사람이 거의 없기 때문에 다른 인코딩을 사용합니다. –

+0

또는 내부 처리를 위해 utf-16 또는 utf-32로 변환하는 방법은 무엇입니까? –

2

예, std::string이 appropriare입니다하지만 당신은 눈치 챘으로 만 바이트, 유니 코드 코드 포인트에서 작동합니다. 이 경우 std::string은 불투명 한 유형입니다. 이것은 반드시 나쁜 것은 아닙니다 (사실, 몇 가지 장점이 있습니다, 아래 링크를 참고하십시오). 문자에 대한 정보가 필요하면 문자열을 디코드해야합니다.

실제로 UTF-8을 처리하려면 (필요한 경우) Boost.NoWide 라이브러리를 사용하여 UTF-8을 디코딩 할 수 있습니다.

또한 UTF-8 대 다른 유니 코드 변환에 대한 정보는 UTF-8 everywhere manifesto을 읽어 보시기 바랍니다.

+0

std :: string은 모든 종류의 방법으로 문자열을 정렬하고 문자를 테스트하는 것을 정말 어렵게 만듭니다. 그런 것들이 필요하지 않다면 실제로 std :: string을 사용하여 UTF-8 문자열을 사용할 수 있습니다. QString (Qt) 또는 CString (MFC ...)을 사용할 수도 있습니다. –

+0

링크를 제공 해주신 @Konrad Rudolph에게 감사드립니다. 그것들은 유용했습니다 ... 처음 보았을 때, Boost.Nowide 라이브러리는 stringstream을 가지고 있지 않은 것처럼 보였습니다 ... 그러나 자세히보아야합니다. – PermanentGuest

+1

@Alexis 사용자 정의 비교자를 제공 할 수 있습니다 (반드시 * 필수). 그것은'std :: string'에 국한되지 않습니다. 문자 결합 등으로 인해 넓은 문자로 작업 할 때조차 사실입니다. –

관련 문제