0

我正在尝试将多字节(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 可以正常工作。我究竟做错了什么?

4

3 回答 3

1

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

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

因此,尝试将 UTF 转换为wchar_t(在 Windows 上是 UTF16,在 linux 上是 UTF32)mbsnrtowcs只是无法完成。

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

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

于 2012-11-10T12:40:23.053 回答
0

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

于 2012-11-07T00:38:40.277 回答
0

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

于 2012-12-27T22:50:31.327 回答