【发布时间】:2019-09-12 18:49:15
【问题描述】:
我正在尝试编写一个程序,它将文件作为输入,迭代文件,然后检查文件是否包含 UTF-8 编码字符。
但是我不确定如何解决 UTF-8 编码的问题。我理解编码背后的基本概念,它可以存储在 1-4 个字节中,其中 1 个字节只是 ASCII 表示(0-127)。
1 个字节:0xxxxxxx
对于其余部分,我相信模式是这样的:
2 个字节:110xxxxxx 10xxxxxx
3 个字节:1110xxxx 10xxxxxx 10xxxxxx
4个字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
但是,我很难意识到如何在 C 代码中实现这一点。我知道我将如何迭代文件,如果 UTF-8 编码的谓词成立,我会做一些事情:
while ((check = fgetc(fp)) != EOF) {
if (*) {
// do something to the code
}
}
但是,我不确定如何将 UTF-8 的编码实际修改和实现为 C(或任何没有内置函数的语言,例如 C# UTF8Encoding)。
作为一个使用与 ASCII 类似的逻辑的简单示例,我只需遍历每个字符(指向检查变量)并验证它是否在 ASCII 字符限制内:
if (check >= 0 && check <= 127) {
// do something to the code
}
谁能尝试向我解释我将如何使用类似的逻辑,只有在尝试确定检查变量是否指向 UTF-8 编码字符时?
【问题讨论】:
-
if (ch&0xe0==0xc0){...one byte will follow...}等等... -
只需解码代码点。然后检查它们的编码是否最短。
-
@wildplasser 能否详细说明一下 $(ch&xe0==0xc0)$ 的内部结构,我不太清楚如何理解这个?
-
字面意思是
AND,ch和0x11100000的内容,并用0x11000000测试相等性。 -
@wildplasser — 我可以假设您的意思是
if ((ch & 0xE0) == 0xC0),问题在于额外的括号而不是大写或空格。目前{…}中的代码不会被执行,因为0xE0不等于0xC0,所以&的RHS为0,所以ch & 0的结果为0。