在仍然使用XCode 3的项目中(没有像codecvt这样的C ++ 11功能)
答案 0 :(得分:1)
使用转化库,例如libiconv。您可以根据需要将其输入编码设置为"UTF-16LE"
或"UTF-16BE"
,并将其输出编码设置为"wchar_t"
,而不是任何特定的字符集。
#include <iconv.h>
uint16_t *utf16 = ...; // input data
size_t utf16len = ...; // in bytes
wchar_t *outbuf = ...; // allocate an initial buffer
size_t outbuflen = ...; // in bytes
char *inptr = (char*) utf16;
char *outptr = (char*) outbuf;
iconv_t cvt = iconv_open("wchar_t", "UTF-16LE");
while (utf16len > 0)
{
if (iconv(cvt, &inptr, &utf16len, &outptr, &outbuflen) == (size_t)(−1))
{
if (errno == E2BIG)
{
// resize outbuf to a larger size and
// update outptr and outbuflen according...
}
else
break; // conversion failure
}
}
iconv_close(cvt);
答案 1 :(得分:0)
为什么你想要mac上的wchar_t
? wchar_t
不一定是16位,在mac上不是很有用。
我建议使用
转换yoNSString
char* payload; // point to string with UTF16 encoding
NSString* s = [NSString stringWithCString:payload encoding: NSUTF16LittleEndianStringEncoding];
将NSString转换为UTF16
const char* payload = [s cStringUsingEncoding:NSUTF16LittleEndianStringEncoding];
请注意,mac支持NSUTF16BigEndianStringEncoding
。
注2:虽然使用了const char *,但数据是用UTF16编码的,所以不要将其传递给strlen()
。
答案 2 :(得分:0)
我会走最安全的路线。
NSString
)mbstowcs()
将UTF-8多字节字符串转换为wchart_t 确保每一步都保护字符串值。