C 将特定范围的所有UTF-8字符打印为UTF-8编码文本

C 将特定范围的所有UTF-8字符打印为UTF-8编码文本,c,encoding,utf-8,C,Encoding,Utf 8,我有这个代码来打印1536到1791之间的所有字符(阿拉伯语字符) #包括 void main() { int t; t=1536; 做 { printf(“%c”,t); t++; } 而(tUnicode为(某些)数字0–0x10FFFF赋予了一个含义。我们称这些具有“代码点”含义的数字及其相关含义为“字符” UTF-8是一种二进制格式,用于将Unicode字符表示为字节序列。它是一种可变长度编码,其中代码点值低于0x80的字符为一个字节,低于0x800的字符为两个字节,低于0x10000的

我有这个代码来打印1536到1791之间的所有字符(阿拉伯语字符)

#包括
void main()
{
int t;
t=1536;
做
{
printf(“%c”,t);
t++;
}
而(tUnicode为(某些)数字0–0x10FFFF赋予了一个含义。我们称这些具有“代码点”含义的数字及其相关含义为“字符”

UTF-8是一种二进制格式,用于将Unicode字符表示为字节序列。它是一种可变长度编码,其中代码点值低于0x80的字符为一个字节,低于0x800的字符为两个字节,低于0x10000的字符为三个字节,其他所有字符为四个字节

UTF-8的部分实现仅适用于前2048个代码点(涵盖您的用例),可能如下所示:

#include <stdio.h>

void utf8print(unsigned int cp)
{
    if (cp < 0x80)
    {
        printf("%c", cp);
    }
    else if (cp < 0x800)
    {
        printf("%c%c", 0xC0 + cp / 0x40, 0x80 + cp % 0x40);
    }
    // you should implement the three- and four-byte cases, too.
}

int main()
{
    // characters below 32 are "not printable"
    for (unsigned int i = 32; i != 2048; ++i)
    {
        printf("U+%04X: ", i);
        utf8print(i);
        fputc('\n', stdout);
    }
}
#包括
无效UTF8打印(无符号整数cp)
{
if(cp<0x80)
{
printf(“%c”,cp);
}
否则如果(cp<0x800)
{
printf(“%c%c”,0xC0+cp/0x40,0x80+cp%0x40);
}
//您还应该实现三字节和四字节的情况。
}
int main()
{
//32以下的字符为“不可打印”
for(无符号整数i=32;i!=2048;++i)
{
printf(“U+%04X:,i”);
utf8print(i);
fputc('\n',stdout);
}
}

这只是将原始字节写入标准输出;您的责任是设置输出终端以理解UTF-8,或者将输出捕获到文件中并在处理UTF-8的应用程序中打开它。

了解什么是Unicode,什么是UTF-8,以及I/O在C中的工作方式。您的代码有很多错误……给定的sample输出未列出1536到1791范围内的字符。仅包含少数阿拉伯字符,它们的存在表明字符0-255以非UTF-8编码打印到终端窗口,然后复制粘贴到该网站,该网站使用UTF-8。您能解释一下printf(“%c%c”)的代码是什么吗,0xC0+cp/0x40,0x80+cp%0x40);Thanks@user2999200:它实现UTF-8。一旦您了解了什么是UTF-8,就应该清楚该代码的作用。
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”
#include <stdio.h>

void utf8print(unsigned int cp)
{
    if (cp < 0x80)
    {
        printf("%c", cp);
    }
    else if (cp < 0x800)
    {
        printf("%c%c", 0xC0 + cp / 0x40, 0x80 + cp % 0x40);
    }
    // you should implement the three- and four-byte cases, too.
}

int main()
{
    // characters below 32 are "not printable"
    for (unsigned int i = 32; i != 2048; ++i)
    {
        printf("U+%04X: ", i);
        utf8print(i);
        fputc('\n', stdout);
    }
}