Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么mbstowcs会返回;无效的多字节字符“;_C++_C_Utf 8_Utf 16 - Fatal编程技术网

C++ 为什么mbstowcs会返回;无效的多字节字符“;

C++ 为什么mbstowcs会返回;无效的多字节字符“;,c++,c,utf-8,utf-16,C++,C,Utf 8,Utf 16,“קמ”חיר!“是从gdb中的变量打印粘贴的输入字符串副本。调用mbstowcs返回-1,另一个输入为NULL。有什么问题/如何解决吗 “\327\247\327\236”\327\223\327\227\327\231\327\250!\000\000\000”是八进制非ascii字符的字符串 程序区域设置为C。mbtowcs函数不处理UTF-8编码,没有可以设置的区域设置,使其将UTF-8转换为wchar\t。因此,我将使用Windows示例,但总体思路在大多数操作系统上是相同的 在多字节

“קמ”חיר!“
是从gdb中的变量打印粘贴的输入字符串副本。调用mbstowcs返回-1,另一个输入为NULL。有什么问题/如何解决吗

“\327\247\327\236”\327\223\327\227\327\231\327\250!\000\000\000”是八进制非ascii字符的字符串


程序区域设置为C。

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

在多字节字符集世界中,给定的八进制值可能没有一个含义,任何给定的字符也可能没有一个八进制值。特定八进制值的含义以及字符的表示方式(或即使可以表示)由以下因素决定

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

如果您没有显式设置语言环境(通过调用),那么您将根据系统配置获得语言环境。要检索当前区域设置,可以调用。一旦您了解了您的区域设置,您就可以找出特定八进制值代表的字符(如果有的话),然后您就可以找出UNICODE等价物是什么(如果有的话)

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

7月25日更新

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

当面对UTF-8时,我们可以使用代码页CP_UTF8调用mbtowcs,而不是调用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);

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

在多字节字符集世界中,给定的八进制值可能没有一个含义,任何给定的字符也可能没有一个八进制值。特定八进制值的含义以及字符的表示方式(或即使可以表示)由以下因素决定

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

如果您没有显式设置语言环境(通过调用),那么您将根据系统配置获得语言环境。要检索当前区域设置,可以调用。一旦您了解了您的区域设置,您就可以找出特定八进制值代表的字符(如果有的话),然后您就可以找出UNICODE等价物是什么(如果有的话)

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

7月25日更新

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

当面对UTF-8时,我们可以使用代码页CP_UTF8调用mbtowcs,而不是调用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");

我打赌,如果您将UTF-8设置为这样,它将起作用:

setlocale(LC_CTYPE, "UTF-8");

我们需要字符串的十六进制转储,而不是复制粘贴的文本。如果复制并粘贴字符串,它将不会保留二进制数据。您的程序在什么语言环境中?
mbstowcs
用于与运行时交互。如果通过使用已知编码对源进行反序列化来获取字符串,则应使用类似于
iconv
的方法将已知编码转换为WCHAR\T。我们需要字符串的十六进制转储,而不是复制粘贴的文本。如果复制并粘贴字符串,它将不会保留二进制数据。您的程序在什么语言环境中?
mbstowcs
用于与运行时交互。如果您通过反序列化具有已知编码的源来获取字符串,则应使用类似于
iconv
的方法将已知编码转换为WCHAR\T。该字符串实际上是通过facebook发送给我的,而不是本地生成的。那么我该如何翻译它呢?mbstowcs函数不知道(或关心)被翻译的字符串来自Facebook。它所做的只是查看当前的语言环境设置,并将字符串转换为所使用的编码。你需要弄清楚Facebook使用的是什么代码页,然后适当地设置你的语言环境。或者,更好的方法是使用提供UNICODE字符串而不是多字节字符串的Facebook API。这样一来,使用的编码毫无疑问,而您不必担心;不需要翻译成宽字符。10000002063315 0xD7 0x99 0xD7 0x95 0xD7 0x97 0xD7 0x90 0xD7 0x99 0x20 0xD7 0x95 0xD7 0x9B 0xD7 0x98 0xD7 0xA8这是来自facebook的响应。不知怎的,IE/Firefox显示了