簡體   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