size_t mbstowcs(wchar_t * dest,const char * src,size_t n);如何正确调用mbstowcs?
我有一些信息使用gb2312编码,需要在android平台上更改为unicode。
1.before调用此方法是否正确setlocale(LC_ALL,“zh_CN.UTF-8”)?
2. how需要分配到dest吗?
3.传递给n的是strlen(src)吗?
非常感谢。
size_t mbstowcs(wchar_t * dest,const char * src,size_t n);如何正确调用mbstowcs?
我有一些信息使用gb2312编码,需要在android平台上更改为unicode。
1.before调用此方法是否正确setlocale(LC_ALL,“zh_CN.UTF-8”)?
2. how需要分配到dest吗?
3.传递给n的是strlen(src)吗?
非常感谢。
mbstowcs()
会将字符串从当前语言环境的多字节编码转换为宽字符字符串。宽字符字符串不一定是unicode,但在Linux上它们是(UCS32)。
如果您将语言环境设置为zh_CN.UTF-8
,那么当前语言环境的多字节编码将为UTF-8,而不是GB2312。您需要设置一个GB2312语言环境,以使用该多字节编码处理输入。
C标准意味着单个多字节字符将产生最多一个宽字符,所以可以在宽字符所要求的数量使用strlen(src)
作为上限:
size_t n = strlen(src) + 1;
wchar_t *dest = malloc(n * sizeof dest[0]);
(glibc的具有延伸该标准mbstowcs()
接口,它允许你传递一个NULL
指针找出到底有多少宽字符将被转换生产,但不会帮助你在Android),它的工作原理是这样的:
size_t n = mbstowcs(NULL, src, 0) + 1;
应该传递的值n
是应该通过dest
指针写入的最大宽字符数,包括终止空宽字符。
但是,您应该考虑使用已成功编译为Android的libiconv
。它允许你明确地选择你感兴趣的源和目标字符集,并且更适合这个问题。
当我测试时,n总是1。你的第一行是什么意思? – Aaron
@Aaron:对不起,这实际上是'mbstowcs()'的glibc扩展,在Android上不可用 - 我已经更新了答案。 – caf