mbstowcs大小(wchar_t*dest,const char*src,size_t n);
我有一些信息使用gb2312编码,需要在android平台中更改为unicode。
1.在调用此方法之前,设置locale(LC_ALL,“zh_CN.UTF-8”)是否正确?
2.需要分配给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
指针写入的宽字符的最大数目,包括终止空宽字符。但是,您应该考虑使用
libiconv
,它已经为Android成功编译。它允许您显式地选择您感兴趣的源和目标字符集,并且更适合于此问题。