繁体   English   中英

如何正确跳过 unicode (UTF-8) 字符?

[英]How to correctly skip unicode (UTF-8) characters?

我编写了一个解析器,结果证明它无法正确处理 UTF-8 文本。

解析器非常非常简单:

while(pos < end) { 

// find some ASCII char
if (text.at(pos) == '@') {
// Check some conditions and if the syntax is wrong...
if (...)
  createDiagnostic(pos);
} 

pos++;
}

所以你可以看到我正在pos创建一个诊断。 但是,如果有一些 UTF-8 字符(因为 UTF-8 字符实际上包含多个char 。我如何正确跳过 UTF-8 字符,如果它们是一个字符?

我需要这个,因为诊断被发送到支持 UTF-8 的 VSCode。

我试图在 C++ 中阅读有关 UTF-8 的一些文章,但我发现的每一个材料都是巨大的。 我只需要跳过 UTF-8。

如果代码点小于 128,则 UTF-8 将其编码为 ASCII(未设置最高位)。 如果代码点等于或大于 128,则所有编码字节都将设置最高位。 因此,这将起作用:

unsigned char b = <...>; // b is a byte from a utf-8 string
if (b&0x80) {
    // ignore it, as b is part of a >=128 codepoint
} else {
    // use b as an ASCII code
}

注意:如果要计算字符串中 UTF-8 代码点的数量,则必须计算字节数:

  • !(b&0x80) :这意味着该字节是一个 ASCII 字符,或者
  • (b&0xc0)==0xc0 :这意味着,该字节是多字节 UTF8 序列的第一个字节

暂无
暂无

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

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