【问题标题】:Convert a string with accents from console in a UTF8 wstring在 UTF8 wstring 中从控制台转换带有重音符号的字符串
【发布时间】:2017-05-14 06:33:26
【问题描述】:

当我在 Windows 控制台中输入“café”时,在宽字符串中我得到了“caf” 'c' 代码:99 'a' 代码:97 'f' 代码:102 '' code : 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 微软。

【问题讨论】:

  • I need a wstring encoded with UTF8 什么?!您正在尝试将 UTF-8 字符存储在 wide 字符串中?这与它的用途完全相反——你需要一个用于 UTF-8 的常规 8 位字符串,句号。在任何平台上。
  • 它允许我在字符占用超过一个字节的情况下进行比较...如果你能帮助我从控制台获得一个 UTF8 std::string 我会处理剩下的。
  • 在 Linux 上,一切都适用于 UTF8。在 Windows 上使用“代码页 CP”。此 CP 是 UTF7 (ASCII),第 8 位用于 127 个额外字符,具体取决于您的系统配置。 Windows 内部使用 UTF16 表示(“宽字符”)。您需要寻找一些在这些不同表示之间进行转换的库。
  • 问题只是控制台输入:(
  • 使用_setmode 接收正确的std::wstring,然后将其与另一个std::wstring 进行比较。请参阅此 SO 答案 stackoverflow.com/a/40417293/4603670 - 使用 WideStringToMultibyte 将 UTF16 转换为 UTF8(但我认为您在这里不需要)。请注意,Windows 控制台对某些亚洲语言的 Unicode 支持有限。

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


【解决方案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 吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2014-06-01
    • 2014-04-23
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多