按代码打印Unicode字符

时间:2015-01-07 16:30:42

标签: c unicode utf-8

我有一个uint32_t数组。每个都是表示Unicode字符的值。我想像字符串一样打印数组,但我无法使其工作。

我尝试了很多不同的事情

typedef struct String {
    uint32_t *characters;
    unsigned long length;
} WRString;

char* WRStringToString(WRString *wstr){
    char *string = malloc(sizeof(char) * wstr->length * 4);
    int i = 0;
    int j = 0;
    for (; i < wstr->length; i++) {
        string[j++] = wstr->characters[i];

        char byte2 = (char)wstr->characters[i] >> 8;
        if (byte2) {
            string[j++] = byte2;

            char byte3 = (char)wstr->characters[i] >> 16;
            if (byte3) {
                string[j++] = byte3;

                char byte4 = (char)wstr->characters[i] >> 24;
                if (byte4) {
                    string[j++] = byte4;
                }
            }
        }
    }
    return string;
}

始终使用

WRString *string; //Characters are 0xD6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69, 0x63, 0x68     

我试过了:

setlocale(LC_CTYPE,"de_DE.UTF-8");
puts(WRStringToString(string));

提供\326\377\377\377sterreich

wprintf(L"%s",WRStringToString(string));
只要没有设置本地,

就会一样。

Printing UTF-8 strings with printf - wide vs. multibyte string literalsPrinting Unicode Character (stored in variables) in C对我没有帮助。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

这些似乎只是unicode代码点。将它们逐个存储在wchar_t字符串中,然后使用

打印
printf("%ls\n", wstring);

您必须将程序开头的区域设置设置为系统的默认值:

set_locale(LC_ALL, "");

答案 1 :(得分:1)

Jens Gustedt的答案指向正确的方向,但我一直在使用uint32_t,因为我需要支持Unicode的Emojis,而wchar_t对于那些来说可能太小了。 (如上所述Remy Lebeau)

这似乎工作得非常好:

setlocale(LC_CTYPE,"de_DE.UTF-8");
printf("%ls\n", string->characters);