繁体   English   中英

使用getchar()在C中进行UTF-8编码

[英]UTF-8 encoding in C with getchar()

我必须编写一个采用UTF-8编码的字符并将其“翻译”为Unicode的代码。 您可以在此处检查什么是UTF-8: https://en.wikipedia.org/wiki/UTF-8 我是C初学者,所以对我有三个限制:

  1. 我必须使用getchar()
  2. 禁止使用数组
  3. 我只对1,2,3和4个字节的Unicode字符感兴趣

所以我有这段代码,它对4个字节完全起作用(我知道我必须对每个getchar();使用!= EOF getchar();但是现在这不是我的问题)

#include <stdio.h>

int main(void) {
        int ch1, ch2, ch3, ch4, c;
        ch1 = getchar();
        ch2 = getchar();
        ch3 = getchar();
        ch4 = getchar();
        if ((ch1 & 0xF8) != 0xF0 || (ch2 & 0xC0) != 0x80 ||
                        (ch3 & 0xC0) != 0x80 || (ch4 & 0xC0) != 0x80) {
                printf("Error in UTF-8 4-byte encoding\n");
                return 1;
        }
        c = ((ch1 & 0x07) << 18) | ((ch2 & 0x3F) << 12) |
                        ((ch3 & 0x3F) << 6) | (ch4 & 0x3F);
        printf("c = %05X\n", c);
        return 0;
}

我的问题:我不明白如何在1-2-3个字节中使用getchar() 我的意思是,我必须首先阅读所有getchar函数,然后将ch1用于1个字节的字符,并将ch1ch2用于2个字节的字符,否则我必须这样做。 (顺便说一句,下面的代码不起作用,它给了我无限循环;我仅将其用作思想的一个示例。)

#include <stdio.h>

int main (void) {
        int ch1, ch2, ch3, ch4, c;

        if (c >=0x0000 && c<=0x007F ){
             ch1=getchar();
            while (ch1 !=EOF){
                if ((ch1 & 0x80) != 0x00) {
                    printf("Error in UTF-8 1-byte encoding\n");
                    return 1;   
                   }
                 c = ((ch1 & 0x80) << 7);
                 printf("c = %05X\n", c);
                }
        }

您无法通过先读取四个字符然后决定要做什么来做到这一点。 如果角色位于0x00-0x7f中,则将其余字符扔掉,或者必须以更困难的方式处理它们。

正确的方法是读取一个字符。 它会根据最高有效位为1s告诉您需要多少个额外的字符(如果有)。 然后读取多余的位,并在需要时通过移位和消除最高有效位来转换为适当的UNICODE码点。

您可以查看链接到的文档,以查看UNICODE代码点的位如何分配到几个字节。 这也是该算法的简要说明:

  • 读一个字节
  • 如果最高位为零,则无需执行其他操作:代码点为0x00-0x7f
  • 如果最高的三位是110 ,那么您需要一个额外的字节。 取第一个字节的最低5位,将其左移6位,或将第二个字节的最低6位移至最终值
  • 如果最高的四个位是1110 ,那么您需要两个额外的字节。 取第一个字节的最低4位,移位12位,或者从第二个字节的6个最低位移位6,然后最后将第三个字节的6个最低位移位
  • 如果最高的五个位是11110 ,那么您需要三个额外的字节,并将读取它们,像以前一样移位
  • 如果这些条件都不适合,则数据无效
  • 请注意,读取额外的字节时,这些字节必须具有10最高有效位; 其他都无效。

较低的代码甚至无法工作,因为c从未被赋值,所以if条件将是不确定的。 它也无法正确检查字节,因此该代码对您没有太大帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM