当前位置: 首页 > news >正文

UTF-8 字符串如何解码拆分?

UTF-8即8-bit Unicode Transformation Format,是一种用于编码Unicode字符的可变长度字符编码方案。

一、基本特性

  1. 可变长度编码: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)。
  2. 向后兼容性:由于UTF-8编码的ASCII字符与传统的ASCII编码完全相同,因此它与许多老系统和协议兼容。
  3. 无字节序问题:UTF-8以字节为单位进行编码,这使得它在不同平台之间传输数据时不需要考虑字节序的问题。
  4. 同步性好: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
,
欢
迎
关
注
!
谢
谢
!

四、应用特点

  1. 效率高:对于英文文本或主要使用ASCII字符的文本,UTF-8非常高效,因为它们只需要1个字节。
  2. 全球支持:UTF-8支持全球所有书写系统,适用于多语言环境。
  3. 广泛应用:UTF-8是互联网标准HTML和XML的默认编码方式,广泛应用于网页、邮件和其他数据交换格式。

相关文章:

  • 详解SQL数据查询功能
  • Wireshark 2.2.1(32 位)版本详解:功能、安装与使用指南
  • MySQL、Redis通过Python脚本进行资源迁移
  • 嵌入式2-按键
  • 鸿蒙初学者学习手册(HarmonyOSNext_API14)_UIContext(@ohos.arkui.UIContext (UIContext))
  • 代码随想录二刷|图论9
  • XEngine Kit
  • 统计字符(字符串)(gets与fgets的区别)
  • 深入理解Spring Boot Starter及如何自定义Starter
  • C++类对象创建全解析:从构造函数到内存管理
  • C++Primer学习(6.7 函数指针——难!)
  • Centos固定IP配置
  • 搜广推校招面经四十七
  • NaViT:训练任意分辨率和长宽比的 ViT
  • springboot新手入门搭建项目
  • 2025-3-13 leetcode刷题情况(贪心算法--区间问题)
  • Unity AI 技术浅析(三):智能代理(Agents)
  • 破解“光伏+储能+充电”一体化难题!安科瑞全方案打造智慧能源新标杆
  • RocketMQ面试题:进阶部分
  • Java开发第一坑:记一次MySQL ON DUPLICATE KEY UPDATE影响行数异常排查:从现象到解决的全过程
  • 校园网站集群建设/网络营销软文
  • 自适应网站一般做多大尺寸/国内重大新闻十条
  • 网站设计分析/今日热点事件
  • PR做视频需要放网站上/长沙有实力seo优化
  • asp.net做网站实例/如何推广一个平台
  • 速成建站/游戏如何在网上推广