【问题标题】:How to call mbstowcs properly?如何正确调用 mbstowcs?
【发布时间】:2011-11-25 04:40:40
【问题描述】:

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

非常感谢。

【问题讨论】:

    标签: android linux java-native-interface


    【解决方案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 指针写入的最大宽字符数,包括终止的空宽字符。

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

    【讨论】:

    • n 在我测试时始终为 1。你的第一行是什么意思?
    • @Aaron:抱歉,这实际上是mbstowcs() 的 glibc 扩展,在 Android 上不可用 - 我已经更新了答案。
    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 2020-08-25
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2019-08-27
    相关资源
    最近更新 更多