C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录

      • 1. 引言
      • 2. `std::c8rtomb` 函数详解
      • 3. `std::mbrtoc8` 函数详解
      • 4. 使用示例
      • 5. 注意事项
      • 6. 总结

1. 引言

C++20 标准引入了对 UTF-8 编码的更好支持,其中包括两个重要的函数:std::c8rtombstd::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换为窄多字节字符表示,以及将窄多字节字符转换为 UTF-8 编码。这些功能对于处理多语言文本和国际化应用非常关键。

2. std::c8rtomb 函数详解

std::c8rtomb 函数用于将单个 UTF-8 编码点转换为窄多字节字符表示。其定义如下:

std::size_t c8rtomb(char* s, char8_t c8, std::mbstate_t* ps);
  • 参数

    • s:指向窄字符数组的指针,用于存储转换后的多字节字符。
    • c8:要转换的 UTF-8 编码单元。
    • ps:指向转换状态对象的指针,用于在解释多字节字符串时使用。
  • 行为

    • 如果 s 不是空指针且 c8 是有效 UTF-8 编码的最后一个编码单元,则函数会确定存储该编码点的多字节字符表示所需的字节数(包括任何移位序列),并将多字节字符表示存储在 s 指向的字符数组中,同时更新 *ps
    • 如果 c8 不是编码点表示中的最后一个编码单元,则函数不会写入 s 指向的数组,只更新 *ps
    • 如果 s 是空指针,则调用等效于 std::c8rtomb(buf, u8'\0', ps),其中 buf 是某个内部缓冲区。
    • 如果 c8 是空字符 u8'\0',则存储一个空字节,并在前面附加任何恢复初始移位状态所需的移位序列,同时更新 *ps 以表示初始移位状态。
  • 返回值

    • 返回存储在数组中的字节数(包括任何移位序列)。如果 c8 不是编码点的 UTF-8 表示中的最后一个编码单元,则返回值可以为零。
    • 如果 c8 无效(不贡献到对应合法多字节字符的 char8_t 序列),则将 EILSEQ 的值存储在 errno 中,返回 static_cast<std::size_t>(-1),且转换状态未指定。

3. std::mbrtoc8 函数详解

std::mbrtoc8 函数用于将窄多字节字符转换为 UTF-8 编码。其定义如下:

std::size_t mbrtoc8(char8_t* pc8, const char* s, std::size_t n, std::mbstate_t* ps);
  • 参数

    • pc8:指向 char8_t 类型的指针,用于存储转换后的 UTF-8 编码。
    • s:指向多字节字符的指针。
    • ns 指向的数组中的最大字节数。
    • ps:指向转换状态对象的指针。
  • 行为

    • 函数将 s 指向的多字节字符转换为 UTF-8 编码,并存储在 pc8 指向的位置。
    • 如果 s 指向的多字节字符无效,则函数的行为是未定义的。
  • 返回值

    • 返回转换后的 UTF-8 编码所需的字节数。

4. 使用示例

以下是一个简单的示例,展示如何使用 std::c8rtombstd::mbrtoc8

#include <iostream>
#include <cuchar>
#include <cstring>
#include <clocale>int main() {// 设置 C 本地环境为 UTF-8std::setlocale(LC_ALL, "en_US.UTF-8");// 示例 UTF-8 字符串const char* utf8_str = u8"你好,世界!";// 转换为多字节字符char mb_str[100];std::mbstate_t state = {};char* mb_ptr = mb_str;for (const char* p = utf8_str; *p; ) {char8_t c8 = *reinterpret_cast<const char8_t*>(p);std::size_t result = std::c8rtomb(mb_ptr, c8, &state);if (result == static_cast<std::size_t>(-1)) {std::cerr << "Invalid UTF-8 sequence encountered." << std::endl;return 1;}mb_ptr += result;p += std::char_traits<char>::length(reinterpret_cast<const char*>(&c8));}*mb_ptr = '\0';std::cout << "Multibyte string: " << mb_str << std::endl;// 转换回 UTF-8char8_t utf8_result[100];char8_t* utf8_ptr = utf8_result;std::mbstate_t state2 = {};for (const char* p = mb_str; *p; ) {std::size_t result = std::mbrtoc8(utf8_ptr, p, 100, &state2);if (result == static_cast<std::size_t>(-1)) {std::cerr << "Invalid multibyte sequence encountered." << std::endl;return 1;}utf8_ptr += result;p += result;}*utf8_ptr = u8'\0';std::cout << "UTF-8 string: " << reinterpret_cast<const char*>(utf8_result) << std::endl;return 0;
}

5. 注意事项

  • 线程安全:以空指针参数 s 调用 std::c8rtomb 可能会与其他以空指针参数 sstd::c8rtomb 的调用造成数据竞争。
  • 本地环境依赖:这两个函数的多字节编码由当前活跃的 C 本地环境指定。
  • 错误处理:在处理无效的 UTF-8 序列或多字节字符时,需要妥善处理错误,避免程序崩溃。

6. 总结

C++20 通过引入 std::c8rtombstd::mbrtoc8,为处理 UTF-8 编码和窄多字节字符提供了强大的支持。这些函数不仅增强了 C++ 标准库对多语言文本的处理能力,还为国际化应用提供了更灵活的解决方案。开发者在使用这些函数时需要注意线程安全、本地环境依赖以及错误处理等问题,以确保程序的健壮性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI音乐生成革命:解读昆仑万维Mureka O1的技术突破与应用实践

AI音乐生成革命&#xff1a;解读昆仑万维Mureka O1的技术突破与应用实践 全球音乐产业正经历AI技术重塑&#xff0c;昆仑万维最新发布的音乐推理大模型Mureka O1引发行业震动。本文深度解析其技术原理与实测表现&#xff0c;揭开AI音乐创作新纪元的技术密码 一、技术演进&…

《Operating System Concepts》阅读笔记:p483-p488

《Operating System Concepts》学习第 40 天&#xff0c;p483-p488 总结&#xff0c;总计 6 页。 一、技术总结 1.object storage (1)object storage 管理软件 Hadoop file system(HDFS)、Ceph。 二、英语总结(生词&#xff1a;1) 1.commodity (1)commodity: com-(“tog…

强化学习与神经网络结合(以 DQN 展开)

目录 基于 PyTorch 实现简单 DQN double DQN dueling DQN Noisy DQN&#xff1a;通过噪声层实现探索&#xff0c;替代 ε- 贪心策略 Rainbow_DQN如何计算连续型的Actions 强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;通过与环境交互学习最优策略。当状态空间或动…

“11.9元“引发的系统雪崩:Spring Boot中BigDecimal反序列化异常全链路狙击战 ✨

&#x1f4a5; "11.9元"引发的系统雪崩&#xff1a;Spring Boot中BigDecimal反序列化异常全链路狙击战 &#x1f3af; &#x1f50d; 用 Mermaid原生防御体系图 #mermaid-svg-XZtcYBnmHrF9bFjc {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

Cortex-M7进入异常中断分析

使用cmbacktrace库&#xff0c;其支持M3,4,7。 1、串口输出异常信息 #define cmb_println(...) Debug_Printf(__VA_ARGS__)//cmb_println处理可变参数和格式化字符串 int Debug_Printf(const char *fmt, ...) {char buffer[DEBUG_TxBUFLEN];INT16U n;va_list args;va_star…

如何管理间接需求?团队实践分享

管理间接需求的核心方法包括明确需求识别流程、建立规范的需求管理体系、实施有效的需求沟通机制。 其中&#xff0c;明确需求识别流程最为关键。企业在实际业务中&#xff0c;往往会遇到大量的间接需求&#xff0c;如非直接生产性的采购需求、服务类需求等。这些需求往往隐蔽性…

与Aspose.pdf类似的jar库分享

如果你在寻找类似于 Aspose.PDF 的 JAR 库&#xff0c;这些库通常用于处理 PDF 文档的创建、编辑、转换、合并等功能。以下是一些类似的 Java 库&#xff0c;它们提供 PDF 处理的功能&#xff0c;其中一些是收费的&#xff0c;但也有开源选项&#xff1a; 1. iText (iText PDF…

2-2 MATLAB鮣鱼优化算法ROA优化CNN超参数回归预测

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏目录&#xff0c;查看更多内容。 目录 0.引言 1.ROA优化CNN 2.主程序调用 3.结语 0.引言 在博客【ROA优化LSTM超参数回归】中&#xff0c;我们采用ROA对LSTM的学习率、迭代次数…

企业入驻成都国际数字影像产业园,可享150多项专业服务

企业入驻成都国际数字影像产业园&#xff0c;可享150多项专业服务 全方位赋能&#xff0c;助力影像企业腾飞 入驻成都国际数字影像产业园&#xff0c;企业将获得一个涵盖超过150项专业服务的全周期、一站式支持体系&#xff0c;旨在精准解决企业发展各阶段的核心需求&#xf…

线路板元器件介绍及选型指南:提高电路设计效率

电路板&#xff08;PCB&#xff09;是现代电子设备的核心&#xff0c;其上安装了各类电子元器件&#xff0c;这些元器件通过PCB的导电线路彼此连接&#xff0c;实现信号传输与功能执行。 元器件的选择与安装直接决定了电子产品的性能与稳定性。本文将为大家详细介绍电路板上的…

探究 Arm Compiler for Embedded 6 的 Clang 版本

原创标题&#xff1a;Arm Compiler for Embedded 6 的 Clang 版本 原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创日期&#xff1a;20250218&#xff08;首发日期20250326&#xff09; 原创连接&#xff1a;https://blog.csdn.net/liigo/article/details/14653…

RedHat7.6_x86_x64服务器(最小化安装)搭建使用记录(二)

PostgreSQL数据库部署管理 1.rpm方式安装 挂载系统安装镜像&#xff1a; [rootlocalhost ~]# mount /dev/cdrom /mnt 进入安装包路径&#xff1a; [rootlocalhost ~]# cd /mnt/Packages 依次安装如下程序包&#xff1a; [rootlocalhost Packages]# rpm -ihv postgresql-libs-9…

浏览器存储 IndexedDB

IndexedDB 1. 什么是 IndexedDB&#xff1f; IndexedDB 是一种 基于浏览器的 NoSQL 数据库&#xff0c;用于存储大量的结构化数据&#xff0c;包括文件和二进制数据。它比 localStorage 和 sessionStorage 更强大&#xff0c;支持索引查询、事务等特性。 IndexedDB 主要特点…

panda3d 渲染

目录 安装 设置渲染宽高&#xff1a; 渲染3d 安装 pip install Panda3D 设置渲染宽高&#xff1a; import panda3d.core as pdmargin 100 screen Tk().winfo_screenwidth() - margin, Tk().winfo_screenheight() - margin width, height (screen[0], int(screen[0] / 1…

Node.js 包管理工具 - NPM 与 PNPM 清理缓存

NPM 清理缓存 1、基本介绍 npm 缓存是 npm 用来存储已下载包的地方&#xff0c;以加快后续安装速度 但是&#xff0c;有时缓存可能会损坏或占用过多磁盘空间&#xff0c;这时可以清理 npm 缓存 2、清理操作 执行如下指令&#xff0c;清理 npm 缓存 npm cache clean --for…

STM32F103_LL库+寄存器学习笔记05 - GPIO输入模式,捕获上升沿进入中断回调

导言 GPIO设置输入模式后&#xff0c;一般会用轮询的方式去查看GPIO的电平状态。比如&#xff0c;最常用的案例是用于检测按钮的当前状态&#xff08;是按下还是没按下&#xff09;。中断的使用一般用于计算脉冲的频率与计算脉冲的数量。 项目地址&#xff1a;https://github.…

【C++进阶二】string的模拟实现

【C进阶二】string的模拟实现 1.构造函数和C_strC_str: 2.operator[]3.拷贝构造3.1浅拷贝3.2深拷贝 4.赋值5.迭代器6.比较ascll码值的大小7.reverse扩容8.push_back尾插和append尾插9.10.insert10.1在pos位置前插入字符ch10.2在pos位置前插入字符串str 11.resize12.erase12.1从…

wokwi arduino mega 2560 - 点亮LED案例

截图&#xff1a; 点亮LED案例仿真截图 代码&#xff1a; unsigned long t[20]; // 定义一个数组t&#xff0c;用于存储20个LED的上次状态切换时间&#xff08;单位&#xff1a;毫秒&#xff09;void setup() {pinMode(13, OUTPUT); // 将引脚13设置为输出模式&#xff08;此…

vue3项目使用 python +flask 打包成桌面应用

server.py import os import sys from flask import Flask, send_from_directory# 获取静态文件路径 if getattr(sys, "frozen", False):# 如果是打包后的可执行文件base_dir sys._MEIPASS else:# 如果是开发环境base_dir os.path.dirname(os.path.abspath(__file…

后端学习day1-Spring(八股)--还剩9个没看

一、Spring 1.请你说说Spring的核心是什么 参考答案 Spring框架包含众多模块&#xff0c;如Core、Testing、Data Access、Web Servlet等&#xff0c;其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP功能、数据绑定、类型转换等一系列的基础功能&#xff0c;…