如何正确调用mbstowcs?

时间:2011-11-25 04:40:41

标签: android linux java-native-interface

size_t mbstowcs(wchar_t * dest,const char * src,size_t n);

我有一些使用gb2312编码的信息,需要在android平台中更改为unicode。

1.在调用此方法之前,setlocale是否正确(LC_ALL,“zh_CN.UTF-8”)?

2.如何大量分配到dest?

3.传递给n的是什么,是strlen(src)吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

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指针,以确切地知道转换将产生多少个宽字符,但是赢了# 39; t帮助你使用Android。)它的工作原理如下:

size_t n = mbstowcs(NULL, src, 0) + 1;

应该传递的n的值是应该通过dest指针写入的最大宽字符数,包括终止空宽字符。

但是,您应该考虑使用已成功为Android编译的libiconv。它允许您明确选择您感兴趣的源和目标字符集,并且更适合此问题。