【问题标题】:Converting UTF16(Windows wchar_t) to UTF8 in C++ Non-English letters corrupted(Korean)在 C++ 中将 UTF16(Windows wchar_t)转换为 UTF8 非英文字母损坏(韩文)
【发布时间】:2016-11-09 16:05:58
【问题描述】:

我正在尝试制作一个多平台应用程序。在 Windows Store App(winrt) 端,打开一个文件并以 Platform::String 格式读取其路径,即 wchar_t,在 Windows 中为 UTF16。

由于我的核心逻辑与平台无关并且只使用标准 C++ 数据类型,我已通过以下代码将路径转换为 ​​UTF8 中的 std::string:

        Platform::String^ copyPath = copy->Path;
        std::wstring source(copyPath->Data());
        std::wstring_convert<std::codecvt_utf8_utf16<wchar_t >, wchar_t > convert;
        std::string u8CopyPath = convert.to_bytes(source);

但是,当我在调试器中检查 u8CopyPath 时,它会显示非英文字符的损坏字母。据我所知,UTF-8 完全能够编码非英语语言,因为它可以为单个字母使用多个字节。转换中有什么东西会破坏非英文字母吗?

【问题讨论】:

  • 那不是 C++。你用的是什么方言?
  • 是什么让您认为它已损坏?你能显示你在调试器下看到的内容吗? (最好是十六进制)
  • Far as I know, UTF-8 is perfectly capable of encoding non-English languages 是的。但 Visual Studio 及其调试器输出可能无法处理 UTF8。毕竟,大多数微软的产品要么不支持,要么只支持有限的 UTF8。
  • C++/CX,类似于 CLI,但用原生 C++ 实现。
  • @deviantfan:问题不在于无法输出或处理 UTF-8。问题是,char* 是模棱两可的。它可以引用 ASCII 字符串、ANSI 字符串或 UTF-8,Visual Studio 需要决定如何解释数据。由于没有附加任何提示,Visual Studio 选择char* 解释为 MBCS(代码页编码)字符串,因为这是 Windows 上最自然的选择。此外,您可以使用 Visual Studio 保存(和加载)UTF-8 编码的源文件。

标签: c++ utf-8 windows-runtime utf-16 c++-cx


【解决方案1】:

事实证明这只是一个调试器。一旦我将它写入文件并检查它,它就会正确打印出来。

【讨论】:

  • 这是正常行为。调试器将char*s 解释为MBCS 字符串。如果它使用不同的编码,则需要为调试器提供提示,使用C++ format specifiersmystring,s8
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2016-07-09
  • 2013-05-29
  • 1970-01-01
  • 2016-10-08
  • 2012-11-04
相关资源
最近更新 更多