Если вы кормите wchar_t
, char16_t
или char32_t
значение узкой ostream, он будет печатать числовое значение точки кода.iostreams - Печать `` wchar_t` или значение charXX_t` как символ
#include <iostream>
using std::cout;
int main()
{
cout << 'x' << L'x' << u'x' << U'x' << '\n';
}
принты x120120120
. Это связано с тем, что существует operator<<
для конкретной комбинации basic_ostream
с ее номером charT
, но для других типов символов нет аналогичных операторов, поэтому они автоматически преобразуются в int
и печатаются таким образом. Точно так же, не узкие строковые литералы (L"x"
, u"x"
, U"X"
) будут бесшумно преобразованы в void*
и печатаются в качестве значения указателя, и не узкие объектов снабжать струну, тетивой (wstring
, u16string
, u32string
) не будет даже компиляция.
Итак, вопрос: Что является наименее ужасным способом печати wchar_t
, char16_t
или char32_t
значения а на узкую ostream, как символ, а не в качестве числового значения элемента коды? Он должен правильно преобразовать все кодовых точек, которые представляются в кодировке ostream, для этой кодировки и должны сообщать об ошибке, когда код не представлен. (Так, например, при u'…'
и UTF-8 ostream, последовательность из трех байтов 0xE2 0x80 0xA6 должны быть записаны в поток, но учитывая u'â'
и KOI8-R ostream, следует сообщать об ошибке.)
Аналогично , как можно печатать не узкий C-string или строковый объект в узком ostream, преобразовывая в выходную кодировку?
Если это невозможно сделать в соответствии с ISO C++ 11, я возьму ответы на конкретные платформы.
(Вдохновленный this question.)
Короче говоря, вы должны либо 1) использовать широкий ostream, или 2) преобразуете широкие символьные данные в узком кодирующих себя (что является потенциально потерями преобразования). Ostream не может сделать это преобразование для вас. Посмотрите на ['std :: wstring_convert'] (http: //en.cppreference.com/w/cpp/locale/wstring_convert) или использовать библиотеку, например [ICONV] (https://www.gnu.org/software/libiconv/) или [ICU] (http: //site.icu-project. орг /). –