在UTF8 wstring中转换带控制台重音的字符串

时间:2016-12-29 22:30:25

标签: c++ visual-c++ unicode utf-8 wstring

当我在Windows控制台中输入'café'时,在宽字符串中我得到'caf' 'c'代码:99 'a'代码:97 'f'代码:102 ''代码:130或其他奇怪的值与我在互联网上找到的东西,... 233是正确的值,它是'é'的UTF-8代码

#undef      UNICODE
#define     UNICODE
wstring wstrCharsList;
std::getline(wcin, wstrCharsList);
if (!std::wcin.good()) cout << "problem !\n";
wcout << wstrCharsList << std::endl;

我尝试了在其他SO问题和网络上发现的所有内容(特别是:https://alfps.wordpress.com/2011/12/08/unicode-part-2-utf-8-stream-mode/)并且没有任何效果。

我需要一个用UTF8编码的wstring,将它提供给我的API来执行一些字符串比较(使用从文本UTF-8编码的文件加载的字符串。)

注意:在Linux上,我的程序正常运行。 FU Microsoft。

1 个答案:

答案 0 :(得分:1)

通过调整,我找到了上面的解决方案:

const wchar_t * ConvertToUTF16(const char * pStr)
{
   static wchar_t wszBuf[1024];
   MultiByteToWideChar(CP_OEMCP, 0, pStr, -1, wszBuf, sizeof(wszBuf));
   return wszBuf;
}
...
string strExtAsciiInput;
getline(cin, strExtAsciiInput);
wstring wstrTest = ConvertToUTF16(strExtAsciiInput.c_str());

奇迹般地'café'被正确转换为UTF-8 wstring:'é'有233个代码!任何人都可以告诉我为什么这项工作?在MultiByteToWideChar中,当我使用标志CP_UTF8时输出不正确'é'是错误的(2个字节)但是使用CP_OEMCP它正确解析并且'é'具有正确的UTF-8代码...严重WTF?