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로 변환해야합니다.
오른쪽. 슬프게도,'ctype'은 C에서 상속 받았으며'wchar_t'와'char' 사이에 1 : 1 변환을 가정하기 때문에 utf-8 같은 멀티 바이트 인코딩과 근본적으로 호환되지 않습니다. –
예. 난 그냥 내 의심을 확인하고 싶었 :) 나는 내 C/C + + 기술과 녹슨 비트가 될 것 같아 :) 어쨌든 코덱은 내가 원하는 것 같다 ... – Trakhan
codecvt_byname 낮은 이식성을 조심하십시오. Windows에서 작동하는 코드에 대해 로케일 초기화 래퍼를 작성할 준비를하십시오. – Basilevs