[英]UTF-8 encoding in C with getchar()
我必须编写一个采用UTF-8编码的字符并将其“翻译”为Unicode的代码。 您可以在此处检查什么是UTF-8: https://en.wikipedia.org/wiki/UTF-8 。 我是C初学者,所以对我有三个限制:
getchar()
所以我有这段代码,它对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个字节的字符,并将ch1
, ch2
用于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代码点的位如何分配到几个字节。 这也是该算法的简要说明:
110
,那么您需要一个额外的字节。 取第一个字节的最低5位,将其左移6位,或将第二个字节的最低6位移至最终值 1110
,那么您需要两个额外的字节。 取第一个字节的最低4位,移位12位,或者从第二个字节的6个最低位移位6,然后最后将第三个字节的6个最低位移位 11110
,那么您需要三个额外的字节,并将读取它们,像以前一样移位 10
最高有效位; 其他都无效。 较低的代码甚至无法工作,因为c
从未被赋值,所以if
条件将是不确定的。 它也无法正确检查字节,因此该代码对您没有太大帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.