c++11 标准模板(STL)本地化库 - 平面类别 (std::codecvt)- 在字符编码间转换,包括 UTF-8、UTF-16、UTF-32 (三)

devtools/2024/9/19 9:05:50/ 标签: c++, 平面, 标准库模板, STL, locale, codecvt

本地化库

本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C++ 标准库的其他组件的行为。

平面类别

在字符编码间转换,包括 UTF-8、UTF-16、UTF-32

template<

    class InternT,
    class ExternT,
    class State

> class codecvt;

std::codecvt 封装字符串的转换,包括宽和多字节,从一种编码到另一种。通过 std::basic_fstream<CharT> 进行的所有 I/O 操作都使用流中感染的 std::codecvt<CharT, char, std::mbstate_t> 本地环境平面

继承图

标准库提供以下独立(本地环境无关)特化:

定义于头文件 <locale>

std::codecvt<char, char, std::mbstate_t>恒等转换
std::codecvt<char16_t, char, std::mbstate_t>在 UTF-16 和 UTF-8 间转换 (C++11 起)(C++20 中弃用)
std::codecvt<char16_t, char8_t, std::mbstate_t>在 UTF-16 和 UTF-8 间转换 (C++20 起)
std::codecvt<char32_t, char, std::mbstate_t>在 UTF-32 和 UTF-8 间转换 (C++11 起)(C++20 中弃用)
std::codecvt<char32_t, char8_t, std::mbstate_t>在 UTF-32 和 UTF-8 间转换 (C++20 起)
std::codecvt<wchar_t, char, std::mbstate_t>在系统原生宽和单字节窄字符集间转换

另外, C++ 程序中构造每个的 locale 对象实现其自身的四个特化的( locale 限定)版本。

成员类型

成员类型定义
intern_typeInternT
extern_typeExternT
state_typeState

调用 do_in & 从 externT 转换字符串为 internT ,如在从文件读取时

std::codecvt<InternT,ExternT,State>::in, 
std::codecvt<InternT,ExternT,State>::do_in
public:

result in( StateT& state,
           const ExternT* from,
           const ExternT* from_end,
           const ExternT*& from_next,
           InternT* to,
           InternT* to_end,

           InternT*& to_next ) const;
(1)
protected:

virtual result do_in( StateT& state,
                      const ExternT* from,
                      const ExternT* from_end,
                      const ExternT*& from_next,
                      InternT* to,
                      InternT* to_end,

                      InternT*& to_next ) const;
(2)

1) 公开成员函数,调用最终导出类的成员函数 do_in

2) 若此 codecvt 平面定义一个转换,则翻译来自源范围 [from, from_end) 的外部字符为内部字符,将结果置始于 to 的后继位置。不转换多于 from_end - from 个外部字符,不写入多于 to_end - to 个内部字符。令 from_nextto_next 指向最后成功转换元素的后一位置。

若此 codecvt 平面不定义转换,则不转换字符。设置 to_next 等于 to ,不更改 state ,并返回 std::codecvt_base::noconv 。

返回值

std::codecvt_base::result 类型值,按以下方式指示成功状况:

ok转换完成
partial输出缓冲区的中空间不足,或源缓冲的未期待结尾
error遇到无法转换的字符
noconv平面为非转换,不写入输出

非转换特化 std::codecvt<char, char, std::mbstate_t> 始终返回 std::codecvt_base::noconv 。

注意

要求 from <= from_end && to <= to_end 且 state 要么表示初始迁移状态,要么以转换序列中前趋的字符获得。

state 上的效果是有意未指定的。标准平面中,它用于维护像是调用 std::mbsrtowcs 时的状态,从而被更新为反映最后被处理外部字符后的转换状态,但是用户定义平面可以自由地用它维护任何其他状态,例如计量遇到的特殊字符数。

调用示例

#include <iostream>
#include <string>
#include <locale>int main()
{std::locale::global(std::locale("Chinese (Simplified)_China.936"));auto& use_facet = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(std::locale());std::string external = "ABCDEFG";// 注意 wstring_convert 能进行下列内容std::mbstate_t mbstate_t = std::mbstate_t(); // 初始迁移状态std::wstring internal(external.size(), '\0');const char* from_next;wchar_t* to_next;use_facet.in(mbstate_t, &external[0], &external[external.size()], from_next,&internal[0], &internal[internal.size()], to_next);// 为简略跳过错误检查internal.resize(to_next - &internal[0]);std::wcout << L"The string in wide encoding: " << internal << std::endl;return 0;
}

输出

The string in wide encoding: ABCDEFG


http://www.ppmy.cn/devtools/2345.html

相关文章

python_表格处理_pandas_pd.read_csv输入输出参数说明

pd.read_csv 输入参数说明 pd.read_csv() 函数用于从 CSV 文件中读取数据&#xff0c;并返回一个 DataFrame 对象。它的常用输入参数说明如下&#xff1a; filepath_or_buffer&#xff1a;CSV 文件的路径或者文件对象&#xff0c;可以是本地文件路径、URL、文件类对象等。sep&…

ELK日志分析系统之Zookeeper

一、Zookeeper简介 ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务&#xff0c;它提供了一项基本服务&#xff1a;分布式锁服务。分布式应用可以基于它实现更高级的服务&#xff0c;实现诸如同步服务、配置维护和集群管理或者命名的服务。 Zookeepe…

AndroidAutomotive模块介绍(四)VehicleHal介绍

前言 前面的文章中&#xff0c;描述了 Android Automotive 的框架中应用、Framework 层服务等知识&#xff0c;本篇文章将会继续按照 Android Automotive 框架介绍 Vehicle Hal 层服务的内容。 上一篇&#xff1a;AndroidAutomotive模块介绍&#xff08;三&#xff09;CarSer…

Android view点击监听

转载简书&#xff1a;Android无痕埋点&#xff08;1&#xff09;— 点击监听 - 简书

从零实现诗词GPT大模型:GPT是怎么生成内容的?

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 再开始编写GPT之前,我们得对GPT是怎么生成内容的有一个大致的了解。目前的神经网络我们大多都可以看成是一个黑盒,即我们把数据输送给网络后,网络给我我们输出,我们可以不用关心这个黑盒里到底是怎么实现…

接口自动化测试之调用excel实现接口数据依赖

背景 我们把接口的信息按照规定的格式都维护在excel文件中&#xff0c;通过代码实现调用excel&#xff0c;完成接口的自动化测试。这样&#xff0c;只需要负责人将主要逻辑写好之后&#xff0c;公司其他不会写代码的员工&#xff0c;也可以通过维护excel中的接口数据&#xff…

洛谷 P2863

[USACO06JAN] The Cow Prom S 题目描述 有一个 n n n 个点&#xff0c; m m m 条边的有向图&#xff0c;请求出这个图点数大于 1 1 1 的强连通分量个数。 输入格式 第一行为两个整数 n n n 和 m m m。 第二行至 m 1 m1 m1 行&#xff0c;每一行有两个整数 a a a 和…

Android RecyclerView的LayoutManager配置

RecyclerView的item布局方式依赖于其配置的布局管理器。不同的布局管理器可以实现不同的界面效果。 LayoutManager介绍 RecyclerView可以通过setLayoutManager设置布局管理器&#xff0c;该方法的源码如下&#xff1a; /*** Set the {link LayoutManager} that this RecyclerV…

Linux Zookeeper 安装

1 何为伪集群模式 在学习环境中&#xff0c;如果没有多余的服务器&#xff0c;这里就将三个ZooKeeper 节点都安装到本地机器上&#xff0c;故称谓伪集群模式。 虽然&#xff0c;伪集群模式只是便于开发、普通测试&#xff0c;尽量不用于生产环境。从学习的角度来说&#xff0c…

ChatGPT实用技巧:提升论文写作效果

ChatGPT无限次数:点击直达 ChatGPT实用技巧&#xff1a;提升论文写作效果 随着人工智能技术的不断发展&#xff0c;ChatGPT作为一种先进的自然语言生成模型&#xff0c;为学术界和科研人员提供了强大的写作辅助工具。本文将介绍如何利用ChatGPT提升论文写作效果&#xff0c;并…

Go Web框架-Beego

本文主要分享GO语言常用的web框架&#xff1a;Beego框架&#xff0c;简单分享如何快速入门Beego Beego框架 Beego框架的简介 Beego框架是一款开源的由国人开发的全栈式的Web框架&#xff0c;它采用了MVC架构&#xff0c;支持自动化路由、ORM、Session、日志、缓存等功能&#x…

中霖教育:二建考试中六个专业分别有什么特点?

建筑实务 《建筑实务》技术部分多以选择题为主&#xff0c;主要是对各种数据的考查;管理部分以案例题为主&#xff0c;旨在考查大家的综合能力&#xff0c;也是分值占比比较多的部分。进度控制的网络图和流水施工每年必考其一;质量管理主要结合技术部分命题;安全管理和合同管理…

python中中英文打印对齐解决方案

在python中&#xff0c;有时候会出现中英文混合输出的情形&#xff0c;但是由于中文默认是全角格式&#xff08;一个中文字符占用两个字符宽度&#xff09;&#xff0c;这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候&#xff0c;这种差异会导致文…

HBase2.x学习笔记

文章目录 一、HBase 简介1、HBase 定义1.1 概述1.2 HBase 与 Hadoop 的关系1.3 RDBMS 与 HBase 的对比1.4 HBase 特征简要 2、HBase 数据模型2.1 HBase 逻辑结构2.2 HBase 物理存储结构2.3 HBase的表数据模型 3、HBase 基本架构3.1 Master3.2 Region Server3.3 Zookeeper3.4 HD…

第十四届蓝桥杯ABD题

A、阶乘求和&#xff1a; 【问题描述】 令 S 1! 2! 3! ... 202320232023! &#xff0c;求 S 的末尾 9 位数字。 提示&#xff1a;答案首位不为 0 。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一 个整数&#xff0c;在…

【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍

往期回顾 【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框-CSDN博客 【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左&#xff0c;文本水平的效果-CSDN博客 【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍 一、web组件 Web组件是一种用…

webpack--区分开发环境和生产环境

区分开发和生产环境 初步使用 可以直接配置两个文件&#xff1a; dev const path require("path"); const { VueLoaderPlugin } require("vue-loader"); const HtmlWebpackPlugin require("html-webpack-plugin"); const { DefinePlugin…

Python 学习笔记(九)—— 操作系统和环境

目录 一、os模板 二、platform模块 三、扩展第三方库psutil 四、操作系统信息 4.1 使用platform模块 4.2 使用sys模块 4.3 使用os模块 4.4 使用subprocess模块 Python操作系统和环境主要指的是使用Python进行系统级操作和管理的相关功能和工具。 Python提供了许多用于…

ubuntu下的串口调试工具cutecom

系统&#xff1a;ubuntu20.04 &#xff08;1&#xff09;接线 使用 rs485&#xff1c;-----> rs232 转接口&#xff08; 设备直接出来的是rs485&#xff09;&#xff0c;电脑主机接入一根 rs232&#xff1c;-----> USB口 连接线&#xff0c;ubuntu系统下打开 termin…

博客系统项目测试(selenium+Junit5)

在做完博客系统项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#xff08;全…