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

Convert a string with accents from console in a UTF8 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 我的程序运行正常。付微软.

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

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: 'é' has 233 code !谁能向我解释为什么这项工作?在 MultiByteToWideChar 中,当我使用标志 CP_UTF8 时,输出不正确 'é' 是错误的(2 个字节)但是 CP_OEMCP 它被正确解析并且 'é' 具有正确的 UTF-8 代码...说真的 WTF ?