按代码打印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)包含一些有用的代码点,如音乐和数学符号,以及表情符号(在聊天/即时通讯系统中越来越流行)。显然,这些都是错误的