WideCharToMultiByte问题

rub*_*nvb 1 c++ unicode utf-8 utf-16 widechar

我有上一个问题中的可爱函数,如果我这样做可以正常工作:

wstring temp;
wcin >> temp;

string whatever( toUTF8(getSomeWString()) );

// store whatever, copy, but do not use it as UTF8 (see below)

wcout << toUTF16(whatever) << endl;
Run Code Online (Sandbox Code Playgroud)

原始形式被复制,但在形式之间通常包含额外的字符.如果我输入例如àçé输入,并添加一个cout << whatever语句,我将得到?à?ç?é输出.

我是否仍然可以使用此字符串与其他人进行比较,从ASCII源获取?或者不同地问:如果我?à?ç?é通过linux中的UTF8 cout 输出,它会读取àçé吗?是字符串的字节内容,àçé由cin读取UTF8 linux,与Win32 API获取的内容完全相同?

谢谢!

PS:我问的原因是因为我需要使用很多字符串来比较其他读取值(比较和连接......).

Mar*_* Ba 5

让我们从我开始说,似乎没有办法在Windows中通过cout(假设您使用Visual Studio编译)将UTF-8文本输出到控制台.但是你可以做的测试是通过Win32 API fn输出你的UTF-8文本WriteConsoleA:

if(!SetConsoleOutputCP(CP_UTF8)) { // 65001
    cerr << "Failed to set console output mode!\n";
    return 1;
}
HANDLE const consout = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD nNumberOfCharsWritten;
const char* utf8 = "Umlaut AE = \xC3\x84 / ue = \xC3\xBC \n";
if(!WriteConsoleA(consout, utf8, strlen(utf8), &nNumberOfCharsWritten, NULL)) {
    DWORD const err = GetLastError();
    cerr << "WriteConsole failed with << " << err << "!\n";
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

这应输出: Umlaut AE = Ä / ue = ü如果您将控制台(cmd.exe)设置为使用Lucida Console字体.

至于你的问题(取自你的评论)如果

win23 API转换后的字符串与原始UTF8(linux)字符串相同

我会说是:给定一个Unicode字符序列,它的UTF-16(Windows wchar_t)表示通过该WideCharToMultiByte函数转换为UTF-8(char)表示将始终产生相同的字节序列.