2011-11-25 64 views
0

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)吗?

非常感谢。

回答

1

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。它允许你明确地选择你感兴趣的源和目标字符集,并且更适合这个问题。

+0

当我测试时,n总是1。你的第一行是什么意思? – Aaron

+0

@Aaron:对不起,这实际上是'mbstowcs()'的glibc扩展,在Android上不可用 - 我已经更新了答案。 – caf