在 C++ 中解释 UTF-8 unicode 字符串

Interpreting UTF-8 unicode strings in c++

目前使用 WSL2 Ubuntu、G++ 在 C++20 中编码。

如果我有一个包含 utf-8 unicode 字符的 .txt 文件:

▄  ▄ ▄▄▄ ▄   ▄   ▄▄▄▄  ▄▄  ▄   ▄ ▄▄▄
  1. 如何获取此 unicode 字符串的长度(unicode 字符数)?

  2. 如何读取文件内容并打印出unicode字符串?

假设:

  • stdout 支持 UTF-8(在 Windows 上,您可以在 cmd 提示符下使用 chcp 65001
  • 我们计算的是 Unicode 代码点,而不是由多个代码点组成的字形。

UTF-8 编码由位模式后的起始字节组成:

  1. 0xxxxxxx(单字节编码)
  2. 110xxxxx(双字节编码)
  3. 1110xxxx(三字节编码)
  4. 11110xxx(四字节编码)

后续字节使用 10xxxxxx 作为位模式。

可以使用 std::string 读取 UTF-8 并相应地处理字节。

演示代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    ifstream f("input.txt");
    string s;
    getline(f,s);
    cout << "string: " << s << endl;
    cout << "length(bytes): " << s.length() << endl;

    int codepoints = 0;
    for(auto b : s) {
        if((b & 0xC0) != 0x80) // not UTF-8 intermediate byte?
            ++codepoints;
    }

    cout << "length(code points): " << codepoints << endl;
}

输出:

string: ▄  ▄ ▄▄▄ ▄   ▄   ▄▄▄▄  ▄▄  ▄   ▄ ▄▄▄
length(bytes): 72
length(code points): 36