0

0

c++怎么处理UTF-8编码的字符串_c++ UTF-8字符串处理与转换方法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-11-24 01:57:33

|

702人浏览过

|

来源于php中文网

原创

C++中UTF-8字符串可用std::string存储,但size()返回字节数而非字符数,需用第三方库如ICU或std::wstring_convert进行字符级操作。

c++怎么处理utf-8编码的字符串_c++ utf-8字符串处理与转换方法

在C++中处理UTF-8编码的字符串,需要理解UTF-8是一种变长字符编码方式,一个中文字符通常占3到4个字节标准库中的 std::string 可以存储UTF-8数据,但不能直接按“字符”操作(比如获取第n个汉字),因为 std::string::size() 返回的是字节数而非Unicode字符数。

1. 使用 std::string 存储和基本操作 UTF-8 字符串

std::string 本身不关心编码,可以安全地存储UTF-8文本:

std::string utf8_str = "你好,世界"; // 合法,UTF-8 编码
std::cout << utf8_str.size() << " bytes\n"; // 输出可能是 15(每个汉字3字节)

但不能用下标直接访问“第n个字符”,因为 utf8_str[0] 是第一个字节,不是第一个汉字。

2. 遍历 UTF-8 字符(按 Unicode 码点)

要正确遍历每个Unicode字符,需解析UTF-8编码规则。可用循环或第三方库:

立即学习C++免费学习笔记(深入)”;

#include 
#include 

std::vector utf8_to_codepoints(const std::string& str) { std::vector codepoints; for (size_t i = 0; i < str.size();) { uint8_t byte = str[i]; uint32_t codepoint;

    if ((byte & 0x80) == 0) {           // 0xxxxxxx: ASCII
        codepoint = byte;
        i += 1;
    } else if ((byte & 0xE0) == 0xC0) { // 110xxxxx
        codepoint = ((byte & 0x1F) zuojiankuohaophpcnzuojiankuohaophpcn 6) | (str[i+1] & 0x3F);
        i += 2;
    } else if ((byte & 0xF0) == 0xE0) { // 1110xxxx
        codepoint = ((byte & 0x0F) zuojiankuohaophpcnzuojiankuohaophpcn 12) | ((str[i+1] & 0x3F) zuojiankuohaophpcnzuojiankuohaophpcn 6) | (str[i+2] & 0x3F);
        i += 3;
    } else if ((byte & 0xF8) == 0xF0) { // 11110xxx
        codepoint = ((byte & 0x07) zuojiankuohaophpcnzuojiankuohaophpcn 18) | ((str[i+1] & 0x3F) zuojiankuohaophpcnzuojiankuohaophpcn 12) | ((str[i+2] & 0x3F) zuojiankuohaophpcnzuojiankuohaophpcn 6) | (str[i+3] & 0x3F);
        i += 4;
    } else {
        // 处理错误字节(如无效UTF-8)
        codepoint = 0xFFFD; // 替换符
        i += 1;
    }
    codepoints.push_back(codepoint);
}
return codepoints;

}

这样就可以得到每个Unicode码点,实现真正的“字符级”操作。

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

下载

3. 与宽字符转换(UTF-8 ↔ wstring)

Windows平台常用 std::wstringMultiByteToWideChar / WideCharToMultiByte 进行转换:

#ifdef _WIN32
#include 

std::wstring utf8_to_wstring(const std::string& utf8) { int len = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, nullptr, 0); std::wstring wide(len, 0); MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, &wide[0], len); wide.pop_back(); // 移除末尾多余\0 return wide; }

std::string wstring_to_utf8(const std::wstring& wstr) { int len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr); std::string utf8(len - 1, 0); WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &utf8[0], len, nullptr, nullptr); return utf8; }

endif

Linux/macOS推荐使用 ICUBoost.Locale 库进行跨平台处理。

4. 推荐:使用 Boost.Locale 简化处理

Boost.Locale 提供了简洁的UTF-8支持:

#include 
#include 

std::string s = "Hello 世界"; std::cout << boost::locale::length(s) << " characters\n"; // 正确输出字符数

// 转大写(支持Unicode) std::string upper = boost::locale::to_upper(s, "zh_CN.UTF-8");

安装Boost后编译时链接 -lboost_locale 即可。

总结: C++原生不提供完整UTF-8支持,std::string 可存储但不可直接按字符操作。手动解析码点适用于简单场景,复杂项目建议使用 Boost.Locale 或 ICU 库来处理编码转换、字符计数、大小写转换等操作。跨平台开发时尤其要注意系统默认编码差异。

基本上就这些。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

612

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

547

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

542

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

159

2025.07.29

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

33

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.3万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

C++教程
C++教程

共115课时 | 11.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号