在 C++ 中解释 UTF-8 unicode 字符串
Interpreting UTF-8 unicode strings in c++
目前使用 WSL2 Ubuntu、G++ 在 C++20 中编码。
如果我有一个包含 utf-8 unicode 字符的 .txt 文件:
▄ ▄ ▄▄▄ ▄ ▄ ▄▄▄▄ ▄▄ ▄ ▄ ▄▄▄
如何获取此 unicode 字符串的长度(unicode 字符数)?
如何读取文件内容并打印出unicode字符串?
假设:
stdout
支持 UTF-8(在 Windows 上,您可以在 cmd 提示符下使用 chcp 65001
)
- 我们计算的是 Unicode 代码点,而不是由多个代码点组成的字形。
UTF-8 编码由位模式后的起始字节组成:
0xxxxxxx
(单字节编码)
110xxxxx
(双字节编码)
1110xxxx
(三字节编码)
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
目前使用 WSL2 Ubuntu、G++ 在 C++20 中编码。
如果我有一个包含 utf-8 unicode 字符的 .txt 文件:
▄ ▄ ▄▄▄ ▄ ▄ ▄▄▄▄ ▄▄ ▄ ▄ ▄▄▄
如何获取此 unicode 字符串的长度(unicode 字符数)?
如何读取文件内容并打印出unicode字符串?
假设:
stdout
支持 UTF-8(在 Windows 上,您可以在 cmd 提示符下使用chcp 65001
)- 我们计算的是 Unicode 代码点,而不是由多个代码点组成的字形。
UTF-8 编码由位模式后的起始字节组成:
0xxxxxxx
(单字节编码)110xxxxx
(双字节编码)1110xxxx
(三字节编码)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