C++选出一个string字符串之中的UTF-8编码的字
时间: 2024-11-04 20:14:23 浏览: 12
在C++中,选择并处理UTF-8编码的字符通常需要借助库函数或者遍历字符串的方式来逐字节解析。UTF-8是一种变长字符编码,单个字节可以表示ASCII字符,而其他字符则由一到四个字节组成。以下是一个简单的示例,展示如何遍历`std::string`并检查每个字节是否构成UTF-8编码的一部分:
```cpp
#include <iostream>
#include <string>
// 辅助函数,用于判断连续的一组字节是否构成UTF-8编码
bool isContinuationByte(char byte) {
return byte >= 0b1100000 && byte <= 0b1111111;
}
// 解析UTF-8字符
std::u32_t decodeUTF8Char(const std::string &str, size_t &index) {
if (index == str.size()) return UTF8_MAX; // 表示解析结束
char first = str[index];
index++;
if (first < 0b1100000) return static_cast<std::u32_t>(first); // ASCII字符
bool isSurrogatePair = false;
if (isContinuationByte(first)) {
if (index + 1 >= str.size()) return UTF8_MAX;
char second = str[index];
index++;
if ((second & 0b11111100) == 0b10000000) { // 符合高 Surrogate 的条件
isSurrogatePair = true;
}
}
switch (first >> 4) {
case 0: case 1: case 2: case 3: // 1 到 4 字节编码
return isSurrogatePair ? static_cast<std::u32_t>((first << 6) | second) : first;
default:
return UTF8_MAX; // 非法编码
}
}
int main() {
std::string utf8Str = "你好,世界!"; // 示例UTF-8字符串
size_t currentIndex = 0;
for (; currentIndex < utf8Str.size(); currentIndex++) {
std::u32_t charValue = decodeUTF8Char(utf8Str, currentIndex);
if (charValue != UTF8_MAX) {
std::cout << "字符值: " << static_cast<char>(charValue) << std::endl;
} else {
break; // 如果遇到非法编码,停止解析
}
}
return 0;
}
阅读全文