2010-11-25 2 views
2

에서와 안 기본 문자를 사용 :Facet.narrow()는 어디 내가 다음 코드 한 UTF-8

이 출력 생산
#include <iostream> 
#include <string> 
#include <locale> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
locale loc("cs_CZ.utf-8"); 
std::wstring Str = L"aaěščřžýáíéaa"; 
std::string Str2; 
const ctype<wchar_t> &ct = std::use_facet<std::ctype<wchar_t> >(loc); 
for(std::wstring::const_iterator It = Str.begin(); It < Str.end(); ++It) 
    Str2 += ct.narrow(*It, '-'); 
std::cout << Str2 <<std::endl; 
} 

:

[email protected]:/tmp$ ./a.out 
aa---------aa 

을하지만 cs_CZ를 사용하는 경우. 대상 로케일로 ISO-8859-2는, 출력은 올바른 :

[email protected]:/tmp$ ./a.out | iconv -f ISO-8859-2 -t utf-8 
aaěščřžýáíéaa 

왜 심지어 UTF-8에서 제대로 작동하지 않는 이유는 무엇입니까? 이 특정 시스템에서 사용하는 인코딩과 상관없이 wchar_t의 문자를 char로 변환해야합니다.

답변

2

나는 코덱 코덱 패싯이 트릭을해야합니다. Ctype은 멀티 바이트 형식으로 변환하는 동안 싱글 바이트 인코딩 만 처리 할 수 ​​있습니다. ctype :: narrow() 메서드의 형식을 반환하지 않습니다.

+0

오른쪽. 슬프게도,'ctype'은 C에서 상속 받았으며'wchar_t'와'char' 사이에 1 : 1 변환을 가정하기 때문에 utf-8 같은 멀티 바이트 인코딩과 근본적으로 호환되지 않습니다. –

+0

예. 난 그냥 내 의심을 확인하고 싶었 :) 나는 내 C/C + + 기술과 녹슨 비트가 될 것 같아 :) 어쨌든 코덱은 내가 원하는 것 같다 ... – Trakhan

+0

codecvt_byname 낮은 이식성을 조심하십시오. Windows에서 작동하는 코드에 대해 로케일 초기화 래퍼를 작성할 준비를하십시오. – Basilevs

관련 문제