使用mbsnrtowcs进行Multi-Byte到Widechar的转换

时间:2012-11-07 00:17:34

标签: c++ unicode utf-8

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

3 个答案:

答案 0 :(得分:1)

UTF不是多字节字符串(尽管unicode字符将使用多于1个字节表示)。多字节字符串是一个字符串,它使用某个代码页来表示字符,其中一些字符串将使用多个字节。

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

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

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

中的UTF8-CPP

您可以在维基百科上阅读有关UNICODE和UTF8的更多信息。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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