C++ 使用mbsnrtowcs的多字节到宽字符转换

C++ 使用mbsnrtowcs的多字节到宽字符转换,c++,unicode,utf-8,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."; 特殊字符是版权符号 当我使用W

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

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

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

由于您要结合使用ANSI字符和UTF字符,所以应该使用UTF8

因此,尝试使用
mbsnrtowcs
将UTF转换为
wchar\u t
(在windows上是UTF16,在linux上是UTF32)是不可能的

如果您使用UTF8,您应该查看UNICODE处理库。对于大多数任务,我建议使用UTF8-CPP


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

解决方案:默认情况下,每个C程序都使用“C”语言环境,因此我必须调用setlocale(LCTYPE,“”)。这意味着它将使用我环境的语言环境,即en_US.UTF8,并且转换工作正常。

我使用了“locale”命令,我看到LC_CTYPE设置为“en_US.UTF-8”。如果您希望它可移植,为什么不使用boost::nowide?@Pavel我必须使用mbsnrtowcs@tunafish24:那么,如果无法使用
mbsnrtowcs
,您会怎么做?