按代码打印Unicode字符

按代码打印Unicode字符,c,unicode,utf-8,C,Unicode,Utf 8,我有一个uint32\u t数组。每个值都表示一个Unicode字符。我想像打印字符串一样打印数组,但无法使其正常工作 我尝试了很多不同的东西 typedef struct String { uint32_t *characters; unsigned long length; } WRString; char* WRStringToString(WRString *wstr){ char *string = malloc(sizeof(char) * wstr->

我有一个
uint32\u 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;
}
我试过:

setlocale(LC_CTYPE,"de_DE.UTF-8");
puts(WRStringToString(string));
给出
\326\377\377\377sterreich

wprintf(L"%s",WRStringToString(string));
只要未设置本地,则给出相同的值

也不是真的帮我


有什么建议吗?

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

printf("%ls\n", wstring);
您必须在程序开始时将语言环境设置为系统默认设置:

set_locale(LC_ALL, "");

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

printf("%ls\n", wstring);
您必须在程序开始时将语言环境设置为系统默认设置:

set_locale(LC_ALL, "");

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

printf("%ls\n", wstring);
您必须在程序开始时将语言环境设置为系统默认设置:

set_locale(LC_ALL, "");

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

printf("%ls\n", wstring);
您必须在程序开始时将语言环境设置为系统默认设置:

set_locale(LC_ALL, "");

Jens Gustedt的回答指向了正确的方向,但我一直在使用
uint32\u t
,因为我需要支持Unicode的表情符号,
wchar\u t
对于这些符号来说可能太小了。(如上文Remy Lebeau所述)

这似乎工作得非常好:

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

Jens Gustedt的回答指向了正确的方向,但我一直在使用
uint32\u t
,因为我需要支持Unicode的表情符号,
wchar\u t
对于这些符号来说可能太小了。(如上文Remy Lebeau所述)

这似乎工作得非常好:

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

Jens Gustedt的回答指向了正确的方向,但我一直在使用
uint32\u t
,因为我需要支持Unicode的表情符号,
wchar\u t
对于这些符号来说可能太小了。(如上文Remy Lebeau所述)

这似乎工作得非常好:

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

Jens Gustedt的回答指向了正确的方向,但我一直在使用
uint32\u t
,因为我需要支持Unicode的表情符号,
wchar\u t
对于这些符号来说可能太小了。(如上文Remy Lebeau所述)

这似乎工作得非常好:

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



这些不是字符串中的UTF-8字符,或者您可以直接打印它们。它们是Unicode代码点。请直截了当地说出你的术语。@MarkRansom,不,他似乎在他的
uint32\u t
中只编码了utf8字节。这个问题中有太多的术语问题,以至于不清楚你在问什么。我不知道这是否只是一个语言问题,或者对于UTF-8、字符等Unicode概念是否存在误解。@JensGustedt否,他的示例中的第一个字符是0xD6,这是
Ö
的代码点。我怀疑这是一个合法的UTF-8序列。@MarkRansom,好的,是的,所以他真的很困惑。这些不是字符串中的UTF-8字符,或者你可以直接打印它们。它们是Unicode代码点。请直截了当地说出你的术语。@MarkRansom,不,他似乎在他的
uint32\u t
中只编码了utf8字节。这个问题中有太多的术语问题,以至于不清楚你在问什么。我不知道这是否只是一个语言问题,或者对于UTF-8、字符等Unicode概念是否存在误解。@JensGustedt否,他的示例中的第一个字符是0xD6,这是
Ö
的代码点。我怀疑这是一个合法的UTF-8序列。@MarkRansom,好的,是的,所以他真的很困惑。这些不是字符串中的UTF-8字符,或者你可以直接打印它们。它们是Unicode代码点。请直截了当地说出你的术语。@MarkRansom,不,他似乎在他的
uint32\u t
中只编码了utf8字节。这个问题中有太多的术语问题,以至于不清楚你在问什么。我不知道这是否只是一个语言问题,或者对于UTF-8、字符等Unicode概念是否存在误解。@JensGustedt否,他的示例中的第一个字符是0xD6,这是
Ö
的代码点。我怀疑这是一个合法的UTF-8序列。@MarkRansom,好的,是的,所以他真的很困惑。这些不是字符串中的UTF-8字符,或者你可以直接打印它们。它们是Unicode代码点。请直截了当地说出你的术语。@MarkRansom,不,他似乎在他的
uint32\u t
中只编码了utf8字节。这个问题中有太多的术语问题,以至于不清楚你在问什么。我不知道这是否只是一个语言问题,或者对于UTF-8、字符等Unicode概念是否存在误解。@JensGustedt否,他的示例中的第一个字符是0xD6,这是
Ö
的代码点。我怀疑这是一个合法的UTF-8序列。@MarkRansom,好的,是的,所以他真的很困惑。根据wchar,它可以小到一个字节。所以它似乎并不完美,我看不到任何东西在运行
wchar_t l[11]={0x1F330,0xD6,0x73,0x74,0x65,0x72,0x72,0x65,0x69,0x63,0x68};printf(“%ls\n”,l)我是否再次混合了一些内容?您是否将语言环境设置为utf8?C(默认)区域设置无法处理这些字符。此外,您忘记了字符串末尾的
0
字符。另一种选择是,如果您使用的是正确的语言环境,那么使用普通字符串
char s[]=“Östereich”
应该是现成的。@JensGustedt:很少见,但并非不可能。特别是SMP平面(U+10000——​ U+1FFF)包含一些有用的代码点,如音乐和数学符号,以及表情符号(在聊天/即时通讯系统中越来越流行)。显然,这些都是错误的