UTF-8 字符串如何解码拆分?
UTF-8即8-bit Unicode Transformation Format,是一种用于编码Unicode字符的可变长度字符编码方案。
一、基本特性
- 可变长度编码:UTF-8使用1到4个字节来表示一个Unicode字符。对于不同的字符,其编码长度不同:
- 1字节:用于表示标准ASCII字符(U+0000到U+007F)。
- 2字节:用于表示拉丁字母扩展(U+0080到U+07FF)。
- 3字节:用于表示基本多文种平面(BMP)中的其他字符(U+0800到U+FFFF)。
- 4字节:用于表示补充字符(U+10000到U+10FFFF)。
- 向后兼容性:由于UTF-8编码的ASCII字符与传统的ASCII编码完全相同,因此它与许多老系统和协议兼容。
- 无字节序问题:UTF-8以字节为单位进行编码,这使得它在不同平台之间传输数据时不需要考虑字节序的问题。
- 同步性好:UTF-8编码的每个字节都有固定的模式,可以通过检查字节的前几位来判断一个字符的起始位置。这种特性使得在数据损坏或丢失的情况下,更容易恢复和同步。
二、编码规则
UTF-8编码规则根据Unicode字符的码点范围来定义,具体如下:
- 1字节:
0xxxxxxx
(适用于U+0000到U+007F) - 2字节:
110xxxxx 10xxxxxx
(适用于U+0080到U+07FF) - 3字节:
1110xxxx 10xxxxxx 10xxxxxx
(适用于U+0800到U+FFFF) - 4字节:
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(适用于U+10000到U+10FFFF)
三、UTF-8 字符串拆分
#include <iostream> // 包含输入输出流库,用于控制台输入输出
#include <string> // 包含字符串处理库,用于处理std::string
#include <vector> // 包含向量容器库,用于动态数组
#include <cassert> // 包含断言库,用于调试时的条件检查
// 获取UTF-8字符的长度
int utf8CharLength(unsigned char byte) {
// 根据UTF-8编码规则,判断字符长度
if ((byte & 0b10000000) == 0) return 1; // 0xxxxxxx:1字节,适用于ASCII字符
if ((byte & 0b11100000) == 0b11000000) return 2; // 110xxxxx:2字节
if ((byte & 0b11110000) == 0b11100000) return 3; // 1110xxxx:3字节
if ((byte & 0b11111000) == 0b11110000) return 4; // 11110xxx:4字节
return 0; // 返回0表示无效的UTF-8起始字节
}
// 拆分UTF-8字符串为单个字符
std::vector<std::string> splitUTF8String(const std::string& input) {
std::vector<std::string> words; // 用于存储分割后的字符
int len = input.length(); // 获取输入字符串的长度
int i = 0; // 初始化索引
// 逐个字符拆分 UTF-8 字符串
while (i < len) {
int charLength = utf8CharLength(input[i]); // 获取当前字节的字符长度
// 检查字符长度是否有效,以及是否超出字符串长度
if (charLength == 0 || i + charLength > len) {
std::cerr << "Invalid UTF-8 encoding detected!" << std::endl; // 输出错误信息
break; // 退出循环
}
// 提取当前完整字符并添加到结果中
words.push_back(input.substr(i, charLength));
i += charLength; // 移动索引到下一个字符的起始位置
}
return words; // 返回分割后的字符向量
}
int main() {
// 定义一个包含多语言字符的UTF-8字符串
std::string utf8Str = u8"Hello,欢迎关注!谢谢!";
// 调用函数拆分字符串
std::vector<std::string> characters = splitUTF8String(utf8Str);
// 输出每个拆分后的字符
for (const auto& ch : characters) {
std::cout << ch << std::endl; // 输出当前字符
}
return 0; // 程序结束
}
输出
H
e
l
l
o
,
欢
迎
关
注
!
谢
谢
!
四、应用特点
- 效率高:对于英文文本或主要使用ASCII字符的文本,UTF-8非常高效,因为它们只需要1个字节。
- 全球支持:UTF-8支持全球所有书写系统,适用于多语言环境。
- 广泛应用:UTF-8是互联网标准HTML和XML的默认编码方式,广泛应用于网页、邮件和其他数据交换格式。