C++20 中的std::c8rtomb和 std::mbrtoc8
文章目录
- 1. 引言
- 2. `std::c8rtomb` 函数详解
- 3. `std::mbrtoc8` 函数详解
- 4. 使用示例
- 5. 注意事项
- 6. 总结
1. 引言
C++20 标准引入了对 UTF-8 编码的更好支持,其中包括两个重要的函数:std::c8rtomb
和 std::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
:指向多字节字符的指针。n
:s
指向的数组中的最大字节数。ps
:指向转换状态对象的指针。
-
行为:
- 函数将
s
指向的多字节字符转换为 UTF-8 编码,并存储在pc8
指向的位置。 - 如果
s
指向的多字节字符无效,则函数的行为是未定义的。
- 函数将
-
返回值:
- 返回转换后的 UTF-8 编码所需的字节数。
4. 使用示例
以下是一个简单的示例,展示如何使用 std::c8rtomb
和 std::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
可能会与其他以空指针参数s
对std::c8rtomb
的调用造成数据竞争。 - 本地环境依赖:这两个函数的多字节编码由当前活跃的 C 本地环境指定。
- 错误处理:在处理无效的 UTF-8 序列或多字节字符时,需要妥善处理错误,避免程序崩溃。
6. 总结
C++20 通过引入 std::c8rtomb
和 std::mbrtoc8
,为处理 UTF-8 编码和窄多字节字符提供了强大的支持。这些函数不仅增强了 C++ 标准库对多语言文本的处理能力,还为国际化应用提供了更灵活的解决方案。开发者在使用这些函数时需要注意线程安全、本地环境依赖以及错误处理等问题,以确保程序的健壮性和可靠性。
相关文章:
C++20 中的std::c8rtomb和 std::mbrtoc8
文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持,其中包括两个重要的函数:std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…...
树形结构的工具类TreeUtil
这个地方是以null为根节点,相关以null或者0自己在TreeUtil中加代码,就行 基础类 package com.jm.common.entity;import lombok.Data;import java.util.ArrayList; import java.util.List;/*** Author:JianWu* Date: 2025/3/26 9:02*/ Data public clas…...
【零基础入门unity游戏开发——2D篇】2D物理系统 —— 2D刚体组件(Rigidbody2D)
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
人员进出新视界:视觉分析算法的力量
视觉分析赋能离岗检测新策略 随着时代的发展,失业率增加,社会安保压力也随之增大。企业为了提升管理效率,保障园区安全,对员工离岗检测的需求日益迫切。传统的离岗管理方式,如人工巡逻、打卡记录等,不仅效率…...
LabVIEW液压振动锤控制系统
在现代工程机械领域,液压振动锤的高效与精准控制日益显得重要。本文通过LabVIEW软件,展开液压振动锤启停共振控制技术的研究与应用,探讨如何通过改进控制系统来优化液压振动锤的工作性能,确保其在复杂工况下的稳定性与效率。 …...
Slidev使用(一)安装
文章目录 1. **安装位置**2. **使用方式**3. **适用场景**4. **管理和维护** 全局安装1. **检查 Node.js 和 npm 是否已安装**2. **全局安装 Slidev CLI**3. **验证安装是否成功**4. **创建幻灯片文件**5. **启动 Slidev**6. **实时编辑和预览**7. **构建和导出(可选…...
浙大:DeepSeek技术溯源及前沿探索
浙江大学DS系列专题《DeepSeek技术溯源及前沿探索》由朱强教授主讲,内容主要包括 语言模型、Transformer、ChatGPT、DeepSeek及新一代智能体 等核心主题。 下载方式:关注“渡江客涂鸦板”,回复ds1253免费获取下载地址 语言模型:语…...
【八股】未知宽高元素水平垂直居中的三种方法
在笔试/面试中,经常出现的一个问题就是:如何实现元素水平垂直居中? 本文会直接使用代码,介绍未知宽高元素水平垂直居中的三种方法: 方法一:绝对定位absolute //绝对定位,将元素的左右位置设置…...
23种设计模式-中介者(Mediator)设计模式
中介者设计模式 🚩什么是中介者设计模式?🚩中介者设计模式的特点🚩中介者设计模式的结构🚩中介者设计模式的优缺点🚩中介者设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
(免费开源)图片去水印以及照片擦除功能,你会选择使用吗?
图片去水印以及相关人物擦除是一个非常小众的需求,就是将原本图片上的文字或者logo去除让变成一个干净的图片,但市面上很多都是付费的,今天就介绍一下这款免费工具。 工具演示效果 工具介绍 名称:lama-projct 利用AI模型训练LaM…...
Rust 学习笔记(一)
本文是博主学Rust的学习笔记,将学习经历整理下来,学习接收的内容更加条理且以便回顾。 参照学习资料为Rust官方文档,如内容中有误还请指点(一般没有☺) 一. 项目搭建 1.创建项目 cargo new hello_cargo cd hello_c…...
C++vector常用接口和模拟实现
C中的vector是一个可变容量的数组容器,它可以像数组一样使用[]进行数据的访问,但是又不像C语言数组空间是静态的,它的空间是动态可变的。 在日常中我们只需要了解常用的接口即可,不常用的接口查文档即可。 1.构造函数 //空构造…...
AI数据分析:一键生成数据分析报告
作为一名数据分析师,我们经常需要做一些数据分析报告,今天我就来手把手教你如何使用大模型一键生成高质量的数据分析报告,提高你的工作效率。 假设你是一家新零售企业的销售分析师,有一份销售数据,数据结构如数据结构…...
leetcode 2829. k-avoiding 数组的最小总和 中等
给你两个整数 n 和 k 。 对于一个由 不同 正整数组成的数组,如果其中不存在任何求和等于 k 的不同元素对,则称其为 k-avoiding 数组。 返回长度为 n 的 k-avoiding 数组的可能的最小总和。 示例 1: 输入:n 5, k 4 输出&…...
微信小程序登录和获取手机号
目录 准备工作 实现流程 实现代码 公共部分 通过code获取openid等信息 解密手机号 扩展 不借助工具类实现解密 借助工具类获取access_token 准备工作 需要小程序账号(可以去微信公众平台创建一个测试号或者正式号) appid:小程序id …...
漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)
漫画网站 目录 基于SprinBootvue的漫画网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…...
华鲲振宇天工TG225 B1国产服务器试装openEuler22.03 -SP4系统
今天测试了一下在华鲲振宇公司的天工TG225 B1国产服务器上进行openEuler22.03 -SP4操作系统的试装,本文记录整个测试过程。 一、服务器信息 1、服务器型号 Huakun TG225 B1 (D) 2、登录IPMI帐户信息 初始用户名Tech.ON 密码TianGong8000 二、磁盘RAID配置 测试…...
Graphpad Prism for Mac医学绘图
Graphpad Prism for Mac医学绘图 文章目录 Graphpad Prism for Mac医学绘图一、介绍二、效果三、下载 一、介绍 GraphPad Prism for Mac是一款功能强大、易于使用的科学和统计分析软件,适用于各种类型的数据处理和可视化需求。无论您是进行基础研究、临床试验还是学…...
单多表查询练习
课堂代码练习 mysql> select * from t_heros; ----------------------------- | id | name | books | ----------------------------- | 1 | 孙悟空 | 西游记 | | 2 | 猪八戒 | 西游记 | | 3 | 林黛玉 | 红楼梦 | | 4 | 贾宝玉…...
SICAR标准 汽车焊装生产线触摸屏操作说明
目录 SIMATIC HMI 是西门子工业自动化解决方案的核心组件,支持实时设备监控与交互,文档中展示了其在焊装生产线中以SICAR标准为基础的具体应用,包括车型切换(如 AY2/A26)、KMC 夹具配置及能源效率分析,适用…...
Photoshop 2025安装教程包含下载安装包,2025最新版图文安装教程
文章目录 前言一、Photoshop 2025下载二、Photoshop 2025安装教程1. 安装包解压2. 找到安装程序3. 以管理员身份运行4. 安装选项设置5. 选择安装路径6. 开始安装7. 安装完成8. 启动软件9. 软件主界面 前言 无论你是专业设计师,还是刚接触图像处理的新手,…...
SylixOS 中 select 原理及使用分析
1、select接口简介 1.1 select接口使用用例 select 是操作系统多路 I/O 复用技术实现的方式之一。 select 函数允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指:文件描述符不再是阻塞状…...
F1C200S编译
一、查看荔枝派Nano的分区内容 分成了两个分区 将第一个分区通过mount进行挂载,查看到内容包括:主要是dtb设备树和zImage压缩的内核。由于u-boot不是是通过dd指令传输到指定的位置,因此这里不显示。还有一个scr,这是一个uboot启动…...
边缘计算 vs. 云计算,谁才是工业物联网的未来?
前言 在物联网(IoT)飞速发展的今天,边缘计算正在彻底改变数据的处理、存储和分析方式。传统的IoT设备数据通常需要发送到云端进行处理,但随着设备数量的激增,这种模式在延迟、带宽和安全性方面暴露出诸多局限。边缘计…...
vue 使用v-model实现父子组件传值——子父组件同步更新
基于vue2和vue3两个版本的框架略显不同,所以我分开的来讲: 1、vue2 子组件(my-input.vue): <template><input type"text" :value"name" input"inputChange" /> </tem…...
监控易运维在北京某医药集团数字新基建项目中的应用
随着信息技术的快速发展,企业数字化转型已成为当今时代的趋势。北京某医药公司作为一家知名的中医药企业,也在积极推进数字化建设。在数字新基建招标项目中,监控易管理平台 6.0 凭借其强大的功能和特点,成功中标,为医药…...
小智AI音频开发 libopus + Eclipse C/C++ MinGW 编解码测试用例
小智AI音频开发 libopus Eclipse C/C MinGW 编解码测试用例 目录 小智AI音频开发 libopus Eclipse C/C MinGW 编解码测试用例前言移植编解码测试libopus编码器的控制参数信号类型比特率带宽编码复杂度前向纠错声道不连续传输位深帧持续时长码率VBR约束应用类型 示例代码 前言…...
Spring Boot定时任务设置与实现
Spring Boot定时任务设置与实现 在Spring Boot中,可以使用Scheduled注解来创建定时任务。以下是一个简单的示例,展示了如何在项目启动后每5秒调用一次指定的方法。 1. 添加依赖 首先,确保你的pom.xml文件中包含Spring Boot的依赖ÿ…...
海康/大华/宇视/华为/汉邦/天地伟业/英飞拓/科达/中星微/同为/天视通等主流监控设备RTSP地址
RTSP协议是TCP/IP协议体系中的一个应用层协议,该协议主要规定了一对多应用程序如何有效地通过IP网络传送多媒体数据,特别适用于音视频数据的实时传输和控制。 目前监控市场厂家众多,各个厂家的RTSP地址格式不尽一致 以下是海康威视、大华股份…...
FreeRTOS 队列结构体 xQUEUE 深度解析
一、核心成员与功能设计 FreeRTOS 的队列结构体 xQUEUE 是任务间通信(IPC)的核心数据结构,通过统一的设计支持队列、信号量、互斥量等多种同步机制。其设计体现了 **"数据拷贝 结构复用"** 的理念,兼顾轻量化与扩展…...
system V 消息队列信息量(了解)
目录 system V 消息队列 消息队列的基本原理 消息队列数据结构 消息队列接口介绍 消息队列相关函数 消息队列的释放 向消息队列发送数据 向消息队列接收消息 System V 信号量 信号量相关概念 信号量的数据结构 信号量相关函数 进程互斥 system V IPC联系 system V…...
CSS rem、vw/vh、less
目录 分辨率、视口与二倍图 一、分辨率与像素基础 1. 物理像素(Physical Pixels) 2. 逻辑像素(CSS 像素) 二、视口(Viewport)控制 1. 视口类型 2. 设置理想视口 三、二倍图(Retina/HiD…...
CHI协议——retry
一、核心目标 防止请求阻塞:当Completer暂时无法处理请求(比如tracker不够被占满)时,通过retry机制避免请求在 REQ Channel堆积,确保系统流畅运行。 retry机制只存在于REQ Channel,在DAT/RSP/SNP Channel不存在 二、Retry Flow…...
在linux部署网站
在Linux部署网站,需要准备一个纯净的系统 一、系统环境准备 1.设置静态IP地址 2.关闭默认防火墙 systemctl disable firewalld --now 3.配置SSH密钥登录 4.yum update -y && reboot # 更新系统内核 5.yum install -y wget curl unzip # 安装…...
语义网是什么
语义网(Semantic Web)是由万维网发明者 蒂姆伯纳斯-李(Tim Berners-Lee) 在20世纪90年代末提出的概念,目标是让互联网上的数据不仅对人类可读,还能被机器自动理解、关联和推理。它通过为数据添加明确的语义…...
51单片机
本文来源:腾讯元宝 51单片机是对所有兼容Intel 8031指令系统的8位单片机的统称,其技术起源于1981年Intel推出的8051内核微控制器(Micro Control Unit)。作为嵌入式系统领域的经典代表,它具有以下核心特点和应用价值: 一、技术特…...
初2数学-1.勾股定理
复习勾股定理: 1. ; 2. ; 3. ; 4. 后面3个式子都是根据相似三角形对应边成比例推出来的。 第4个式子来做例子: 三角形CBD与三角形 ACD相似,所以: h:c2 c1 : h. 【例题] ABCD为菱形,边长为…...
Java条码与二维码生成技术详解
一、技术选型分析 1.1 条码生成方案 Barbecue是最成熟的Java条码库,支持: Code 128EAN-13/UPC-AUSPS Inteligent Mail等12种工业标准格式 1.2 二维码方案对比 库名称维护状态复杂度功能扩展性ZXing★★★★☆较高强QRGen★★★☆☆简单一般BoofCV★…...
Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例)
Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例) 前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Spring Boot 观察定时任务执行5. Quartz Cron 表达式详解6. 结论 前言 在 Spring Boot 项目中,我们经常…...
数智读书笔记系列025《智能医疗:医学人工智能的未来》
一、书籍概述与核心价值 1.1 书籍定位与影响力 《智能医疗:医学人工智能的未来》在智能医疗领域占据着独特且重要的位置,作为首部由德勤管理咨询引进的 AI 医疗译著,它宛如一座桥梁,连接了人工智能与生物医学这两个看似独立却又紧密关联的领域。在当下智能医疗蓬勃发展但…...
SQL Server 2022常见问题解答
以下是SQL Server 2022的常见问题解答,按主题分类整理: 一、安装与升级 SQL Server 2022的系统要求是什么? 支持的操作系统:Windows Server 2016及以上、Linux(Ubuntu 20.04/22.04, RHEL 8/9等)。内存:至少4GB(建议8GB+)。磁盘空间:6GB以上,具体取决于安装组件。如何…...
SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索
在数据驱动的应用开发中,基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架,提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度,系统对比分析SQLAlchemy中关键词搜索的最佳实…...
react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析
一、React 15(2016) 核心架构:Stack Reconciler(栈协调器) 工作原理: 同步递归渲染:采用深度优先遍历方式递归处理 Virtual DOM,形成不可中断的调用栈渲染流程:1. 触发 …...
[Windows] Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏
微软Edge浏览器 绿色便携增强版 长期更新 链接:https://pan.xunlei.com/s/VOMA-aVC_GPJiv-MzRS89lsVA1?pwdemxj# Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏...
STM32学习笔记之存储器映射(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率
随着分子建模和计算生物学的快速发展,分子对接(Molecular Docking)、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制,还能加速药物设计和优化过程。NRGSuit…...
c#在work线程中怎样更新UI控件
最近笔者调试修改项目,碰到了c#在work线程中怎样更新UI控件中的场景,简单总结了下,主要有两个方法: 方法1:通过System.Windows.Application.Current.Dispatcher.Invoke来更新UI控件 System.Windows.Application.Curre…...
DeepSeek、Grok 与 ChatGPT 4.5:新一代大模型架构与推理能力深度解析
近年来,大语言模型(LLM)领域发展迅猛,DeepSeek、Grok 以及 OpenAI 最新发布的 ChatGPT 4.5 都是该领域的代表性产品。本文将从架构设计、推理能力、训练策略等方面,对三者进行技术对比,探讨其优势与潜在的应…...
从零基础到 Java 网站项目开发学习规划
在数字化时代,Java 凭借其卓越的跨平台性、强大的功能和丰富的类库,成为开发各类网站的主流编程语言。对于想要踏入 Java 网站开发领域的初学者而言,一份系统、科学的学习规划至关重要。它不仅能帮助我们有条不紊地掌握知识和技能,…...
Unity Shader 学习17:合批渲染
一、基础概念 合批主要是针对这三个概念进行优化减少: ① SetPass Call:一次渲染状态切换,也就是每次切换 材质/Pass 时,就会触发一次SetPass Call ② Draw Call:cpu 调用一次 gpu 绘制函数 ③ Batch:表示…...