【问题标题】:Multi-Byte to Widechar conversion using mbsnrtowcs使用 mbsnrtowcs 将多字节转换为 Widechar
【发布时间】:2012-11-07 00:17:34
【问题描述】:

我正在尝试将多字节 (UTF) 字符串转换为 Widechar 字符串,但 mbsnrtowcs 总是失败。这是输入和预期的字符串:

char* pInputMultiByteString = "A quick brown Fox jumps \xC2\xA9 over the lazy Dog.";
wchar_t* pExpectedWideString = L"A quick brown Fox jumps \x00A9 over the lazy Dog.";    

特殊字符是版权符号。

当我使用 Windows MultiByteToWideChar 例程时,此转换工作正常,但由于该 API 在 linux 上不可用,我必须使用 mbsnrtowcs - 这是失败的。我也尝试过使用其他角色,但总是失败。唯一的期望是,当我仅使用基于 ASCII 的输入字符串时,mbsnrtowcs 可以正常工作。我做错了什么?

【问题讨论】:

  • 如果你想要它便携,为什么不使用 boost::nowide?​​span>
  • @Pavel 我必须使用 mbsnrtowcs
  • @tunafish24:如果mbsnrtowcs不能做到,你会怎么做?

标签: c++ unicode utf-8


【解决方案1】:

UTF 不是多字节字符串(尽管 unicode 字符确实会使用超过 1 个字节来表示)。多字节字符串是使用特定代码页来表示字符的字符串,其中一些将使用多个字节。

由于您正在组合 ANSI 字符和 UTF 字符,因此您应该使用 UTF8。

所以尝试使用mbsnrtowcs 将UTF 转换为wchar_t(在Windows 上是UTF16,在Linux 上是UTF32)只是无法完成。

如果您使用 UTF8,您应该查看一个 UNICODE 处理库。对于大多数任务,我建议使用来自 http://utfcpp.sourceforge.net/ 的 UTF8-CPP

您可以在 Wikipedia 上阅读有关 UNICODE 和 UTF8 的更多信息。

【讨论】:

    【解决方案2】:

    MultiByteToWideChar 有一个参数,您可以在其中指定代码页,但 mbsnrtowcs 没有。在 Linux 上,您是否在您的语言环境中设置了 LC_CTYPE 以指定 UTF-8?

    【讨论】:

    • 我使用了“locale”命令,发现 LC_CTYPE 设置为“en_US.UTF-8”。
    【解决方案3】:

    解决方案:默认情况下,每个 C 程序都使用“C”语言环境,所以我必须调用 setlocale(LCTYPE,"").."" 意味着它将使用我环境的语言环境,即 en_US.utf8 并且转换成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-16
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多