mbtowcs 函数不处理 UTF-8 编码,没有您可以设置的语言环境让它将 UTF-8 转换为 wchar_t。因此,我将使用 Windows 示例,但总体思路在大多数操作系统上是相同的。
在多字节字符集的世界中,给定的八进制值可能没有一个含义,任何给定的字符也可能没有一个八进制值。特定八进制值的含义以及字符的表示方式(甚至 如果 可以表示)由locale 确定。
当 mbstowcs 返回错误时,它基本上是在告诉您没有与传入的多字节字符等效的宽字符。这可能意味着没有 UNICODE 字符(不太可能但并非不可能),或者可能意味着语言环境没有为给定的八进制值(或多字节字符的八进制值序列)定义字符。
如果您没有明确设置您的语言环境(通过调用setlocale),那么您将获得一个基于您的系统配置的语言环境。要检索您当前的语言环境,您可以致电_get_current_locale。一旦你知道了你的语言环境,你就可以确定一个特定的八进制值代表什么字符(如果有的话),然后你就可以确定 UNICODE 等价物是什么(如果有的话)。
识别问题字符的一种方法是改变传递给 mbstowcs 的长度,直到找到导致错误的单个字符。蛮力方法可能是从 length=1 开始并增加它直到 mbstowcs 返回 -1。
7 月 25 日更新
从 cmets 的讨论中,我们发现输入字符串(很可能)被编码为 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);