为什么MBSTOWCS会返回"invalid multibyte character"



"קמ"ד חיר!"是从gdb中的变量打印粘贴的输入字符串副本。调用mbstowcs返回-1,其他输入为NULL。有什么问题/如何解决的想法吗?

"327247327236"327223 327227327231327250!000000"是八进制中具有非ascii字符的字符串

程序区域设置为C.

mbtowcs函数不处理UTF-8编码,也没有可以设置为将UTF-8转换为wchar_t的区域设置。因此,我将使用Windows示例,但在大多数操作系统上的总体想法是相同的。

在多字节字符集世界中,给定的八进制值可能没有一个含义,任何给定的字符也可能没有一种八进制值。特定的八进制值的含义以及字符的表示方式(如果可以表示,甚至)由语言环境决定。

当mbstowcs返回错误时,它基本上是在告诉你没有与传递给它的多字节字符等效的宽字符。这可能意味着没有UNICODE字符(不太可能,但也不是不可能),也可能意味着区域设置没有为给定的八进制值定义字符(或者在多字节字符的情况下为八进制值序列)。

如果您没有显式设置您的区域设置(通过调用setlocale),那么您将根据系统配置获得一个区域设置。要检索当前区域设置,可以调用_get_current_locate。一旦您了解了您的区域设置,就可以计算出特定八进制值代表的字符(如果有的话),然后就可以计算UNICODE的等效字符(如果有)。

识别问题字符的一种方法是改变传递给mbstowcs的长度,直到找到导致错误的单个字符。强力方法可能是从长度=1开始,然后增加长度,直到mbstowcs返回-1。

7月25日更新

从评论讨论中,我们发现输入字符串(很可能)编码为UTF-8。虽然最初的答案是正确的(就目前而言),但还不够。在Windows上,您无法创建处理UTF-8编码字符的区域设置。

当面对UTF-8时,我们可以使用代码页CP_UTF8调用MultiByteToWideChar,而不是调用mbtowcs,但该代码仅适用于Windows。。。

BYTE bytes [] = {0xD7,0x99,0xD7,0x95,0xD7,0x97,0xD7,0x90,0xD7,0x99,0x20,0xD7,0x95,0xD7,0x9B,0xD7,0x98,0xD7,0xA8, 0x00};
int result;
// get length of converted string in characters
result = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, (char *)bytes, 
    sizeof (bytes), NULL, 0);
wchar_t * name = new wchar_t [result];
// convert string
result = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, (char *)bytes, 
    sizeof (bytes), name, result);

我敢打赌,如果你像这样设置UTF-8,它会起作用:

setlocale(LC_CTYPE, "UTF-8");

相关内容

最新更新