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:我问的原因是因为我需要使用很多字符串来比较其他读取值(比较和连接......).
让我们从我开始说,似乎没有办法在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)表示将始终产生相同的字节序列.
| 归档时间: |
|
| 查看次数: |
2337 次 |
| 最近记录: |