2012-06-10 7 views
3

std :: string 및 UTF8로 작업하는 것이 다소 복잡한 문제인 것 같아 do 및 dont에 대한 좋은 설명을 찾을 수 없습니다.UTF8 작업

C++의 UTF8에서 제대로 작동하려면 어떻게해야합니까? 오히려 혼란 스럽습니다.

나는 boost::locale을 발견했습니다 나는 글로벌 로케일 설정 : 내가 문제를 얻을 수있을 때, 내가 생각해야하는 일이 후, 그러나

std::locale::global(boost::locale::generator()(""));

를? 파일에서 쓰기/읽기가 예상대로 작동합니까, 문자열 비교 등 ...?

지금까지 나는 다음 알고 있어요 :

  • std::regex/boost::regex 넓은 문자열로 covnert 및 wregex를 사용할 필요가에서 작동하지 않습니다.
  • boost::algorithm::to_upper 내가 알 필요가 무엇보다 다른 boost::locale::to_upper

를 사용할 필요가 작동하지 않습니다?

+0

오른쪽. 응용 프로그램 내부에서 UTF-8로 작업하지 마십시오. C++ 표준 라이브러리는 하나의 인코딩 값 = 하나의 문자로 가정합니다. –

+0

그럼 내가 뭘해야 할까? wstring/UTF16은 하나의 인코딩 값이 아닌 하나의 문자입니까? – ronag

+0

@ Cheersandhth.-Alf : 그 가정은 UCS-4에서도 사실이 아닙니다. 사실, 모든 유니 코드 인코딩에는 사실이 아닙니다. – Fanael

답변

2

웅대 한 유니 코드 세계에 오신 것을 환영합니다.

  1. 죄송합니다

    wchar_t 구현 정의되며, 일반적으로 Windows에서 당신은 룩업에 대한 비교를 사용할 수 있습니다
  2. (예를 들어) 아시아 스크립트에 대한 전체 코드 포인트를 보유하기에 충분하지 않을 것이다, 그러나 정렬 데이터를 수집하고 잠재 고객에게 제시하려면 full collation algorithm이 필요합니다. 예를 들어 독일어 사전의 순서가 독일어 전화 번호부의 순서와 다르다는 것을 알고 있습니다. (울지 ...)
  3. 일반적으로 말하자면, 나는 스스로 문자열을 변형하지 말 것을 권합니다. Boost.Locale 알고리즘은 일반적으로 ICU을 감싸는 방식으로 작동해야하지만 그렇지 않으면 특별 작업을 삼 간다.
  4. 문자열을 여러 부분으로 나누면 단어 가운데에서 분리하지 마십시오. 문자를 두 개로 분할하거나 (발음 구별로 인해 코드 포인트 인식 알고리즘을 사용하는 경우에도) 문자를 분할하지 않아도됩니다 (일부 문화에서는 인접한 문자의 특정 조합을 하나의 문자로 간주하기 때문에).
+0

"일반적으로 Windows에서 Asiatic 스크립트의 전체 코드 포인트를 저장하기에는 충분하지 않습니다."라는 말이 잘못되었습니다. CJK 스크립트는 BMP에 있습니다. – Fanael

+3

@Fanael : 대부분이지만 일부 확장은 [Supplementary Ideographic Plane]에 있습니다. (http://en.wikipedia.org/wiki/Supplementary_Ideographic_Plane#Supplementary_Ideographic_Plane) –

+0

실제로 MS-Windows에서의 현재 유니 코드 지원은 UTF-16을 사용합니다 보충 표의 문자판을 포함하여 모든 유니 코드 문자 (D800과 DFFF 사이의 코드)를 지원하는 데 필요한 전체 20 비트를 지원합니다. 이전 버전의 MS-Windows (Win2k 이상이면)는 UCS-2를 사용했습니다. –