【问题标题】:Unicode code point to utf8 and wctombUnicode 代码指向 utf8 和 wctomb
【发布时间】:2017-01-29 14:18:10
【问题描述】:

我一直在寻找将 unicode 代码点转换为 utf8 的方法。 到目前为止,我已经知道我可以手动完成,也可以使用 iconv。

我也认为 wctomb 会起作用,但它没有:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>

#define CENTER_UTF8 "\xf0\x9d\x8c\x86"
#define CENTER_UNICODE 0x1D306

int main(int argc, char** argv)
{
    puts(CENTER_UTF8); //OK
    static char buf[10];
    int r;

#define WCTOMB(What) \
    wctomb(NULL,0); \
    r=wctomb(buf,What); \
    puts(buf); \
    printf("r=%d\n", r);

    //Either one fails with -1
    WCTOMB(CENTER_UNICODE);
    WCTOMB(htonl(CENTER_UNICODE));
}

有人可以向我解释为什么 wctomb 不会将 unicode 代码点转换为 utf8。我在使用 utf8 语言环境的 Linux 上。

【问题讨论】:

    标签: c linux unicode utf-8


    【解决方案1】:

    您应该在使用wctomb()之前正确更改程序区域设置:

    #include <locale.h>
    /* ... */
    setlocale(LC_ALL, "");
    

    这会根据您的环境设置程序区域设置。 man setlocale

    如果语言环境是一个空字符串,“”,语言环境的每一部分都应该 被修改是根据环境变量设置的。

    附:其实LC_CTYPEwctomb() 来说已经足够了。

    【讨论】:

    • 只要程序在 UTF-8 语言环境中运行就可以使用,否则您需要将调用 setlocale 中的空字符串替换为已安装的 UTF-8 的名称语言环境。
    猜你喜欢
    • 2018-05-17
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多