Facet.narrow () использует символ по умолчанию, в отличие от utf-8 - PullRequest
2 голосов
/ 25 ноября 2010

У меня есть следующий код:

#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;
}

, который производит этот вывод:

xrozeh05@trakhan:/tmp$ ./a.out 
aa---------aa

Но если я использую cs_CZ.ISO-8859-2 в качестве целевой локали, вывод будет правильным:

xrozeh05@trakhan:/tmp$ ./a.out | iconv -f ISO-8859-2 -t utf-8
aaěščřžýáíéaa

Так почему же он не работает правильно даже с utf-8? Мне нужно преобразовать символы из wchar_t в char независимо от того, какую кодировку использует эта конкретная система.

1 Ответ

2 голосов
/ 25 ноября 2010

Я считаю, что фасет codecvt должен помочь.Ctype может обрабатывать только однобайтовые кодировки, пока вы пытаетесь преобразовать в многобайтовую.Вас не беспокоит тип метода ctype :: small ()?

...