2011-02-01 3 views

답변

9

를 ++ 클래스는 표준 : u32string 및 표준 : u16string있다 0X. GCC는 이미 부분적으로 지원하고 있으므로 이미 사용할 수 있지만 유니 코드에 대한 스트림 지원은 아직 수행되지 않았습니다 Unicode support in C++0x.

+0

흠, 나는 새로운 표준에서 주목하지 않았습니다. 매우 흥미로운. C++ 0x 지원이 부족한 컴파일러 (예 : iPhone 컴파일러)에서 사용할 수 없다는 큰 수치가 있습니다. 이 클래스들이 이미 존재하지 않는다는 것이 진정으로 충격적입니다 ... – Goz

+0

흥미롭게도, GCC> 4.4와 VS2010이 모두이를 지원하는 것 같습니다. 어느 것이 훌륭합니다. Windows, Linux 및 Android 모바일 플랫폼을 다루는 주요 플랫폼에서Clang은 또한 "많은"예제가 작동한다고 말합니다 ... – Goz

+2

@Goz 글쎄, 모든 것이 당신만큼 좋지는 않습니다. VS2010은 유니 코드 문자열을 지원하지만 유니 코드 문자열 리터럴을 지원하지 않습니다. u "Hello"는 UTF-16 문자열 리터럴이고 U "Hello"는 UTF-32 리터럴입니다. 비주얼 스튜디오에서 그들을 인식하지 못합니다. 또한 gcc가 입력을 지원하지 않는다고 이미 말했듯이 출력 스트림은 아직 없습니다. – UmmaGumma

7

STL이 아니지만 C++에서 적절한 유니 코드를 원한다면 ICU을 살펴 봐야합니다.

+0

재미있을 것 같습니다. 부끄러운 줄 알았지 만 STL 문자열 지원이 없다면 ... 완벽한 케이스가 될 것입니다 ... – Goz

+0

DB2에 대해 약간의 시간을 보낸 후에 IBM에서 나오는 것을 만지는 것보다 두 번 생각할 것입니다. 너는 그걸로 일 했니? 좋은가요? – davka

+1

@Goz : 나는 더 동의하지 못했습니다. 유니 코드는 바이트 시퀀스를 저장하는 것보다 더 많은 일을 할 수있는 "표준"입니다. –

3

STL에는 UTF-8이 지원되지 않습니다. 대안 youo이 boost codecvt을 사용할 수 있습니다으로 : C에서 잘

//... 
// My encoding type 
typedef wchar_t ucs4_t; 

std::locale old_locale; 
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>); 

// Set a New global locale 
std::locale::global(utf8_locale); 

// Send the UCS-4 data out, converting to UTF-8 
{ 
    std::wstringstream oss; 
    oss.imbue(utf8_locale); 
    std::copy(ucs4_data.begin(),ucs4_data.end(), 
     std::ostream_iterator<ucs4_t,ucs4_t>(oss)); 

    std::wcout << oss.str() << std::endl; 
} 
+0

그 대신 정말로 sropin을 대체하지는 않습니다.) 이상하게도보고 싶습니다. std :: string8, std :: string16 및 std :: string32와 같은 것입니다 ... – Goz

2

UTF-8 지원의 경우 Glib::ustring 클래스가 있습니다. std::string을 모델로하지만 utf-8을 인식합니다 (예 : iterator로 문자열을 스캔 할 때. 또한 몇 가지 제한 사항이 있습니다 (예 : 이터레이터는 항상 const이고, 문자를 대체하면 문자열의 길이를 변경할 수 있으므로 다른 이터레이터를 무효화 할 수 있습니다.

ustring은 다른 인코딩을 utf-8로 자동 변환하지 않으므로 Glib 라이브러리의 경우 다양한 conversion functions이 있습니다. 문자열이 유효한 utf-8인지 여부를 확인할 수 있습니다.

또한, ustringstd::stringustring는 수 std 캐스트 연산자를 가지고, 상호 교환 :: ustring을 구축 할 수있는 문자열을 사용하면, 그 반대의 과정 std::string이 예상되는 매개 변수로 ustring을 통과 할 수 있도록 std::string에서

+0

거의 완벽합니다. 수치스러운 16 및 32 비트 유니 코드 지원에 대한 수치심 ... – Goz

11

그리고 가볍고 사용하기 쉬운 헤더 전용 UTF-8 라이브러리 UTF8-CPP을 잊지 마시기 바랍니다. 드롭 인 대체가 아니지만 std::string과 함께 사용할 수 있으며 외부 종속성이 없습니다.

+0

이것은 멋진 작은 라이브러리입니다 :) – Skurmedel

2

Qt에는 내부적으로 UTF-16을 사용하지만 std :: wstring, UTF-8, Latin1 또는 로캘 인코딩간에 변환하는 방법이 있습니다. 기본적으로 QString을 변환 할 수있는 QTextCodec 클래스도 있습니다. 그러나 Qt를 그냥 문자열로 사용하는 것은 나에게 잔인한 것처럼 보입니다.

+0

그래, 아아, 당신은 전적으로 문자열을 순수하게 사용하고 있습니다. 나는 qt를 좋아하고 꽤 사용합니다 :) – Goz

관련 문제