Как правильно пропустить символы Unicode (UTF-8)? - PullRequest
0 голосов
/ 22 сентября 2019

Я написал анализатор, который, как оказалось, работает некорректно с текстами 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, как если бы они были одним символом?

Мне это нужно, потому что диагностика отправляется в VSCode с поддержкой UTF-8.

Я пытался прочитать некоторые статьи по UTF-8 в C ++, но каждый найденный материал огромен. И мне нужно толькопропустить UTF-8.

1 Ответ

1 голос
/ 22 сентября 2019

Если кодовая точка меньше 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...