8.3 C++11对Unicode的支持

一、C++11对Unicode的支持

在C++98中,引入wchar_t对Unicode支持,但是后来由于不同平台下wchar_t的宽度并不相同(8,16,32位),导致可移植性受到影响。因此从C++11开始引入了char16_t、char32_t以及原有的char,分别存储utf16,utf32和utf8编码的数据。

此外还定义了字符串常量的前缀:

  • u8表示以utf8编码
  • u表示utf16编码
  • U表示utf32编码

以上三种,再加上wchar_t格式的L以及不带前缀的字符串,C++11则包含了5种字符串常量的前缀。

通常情况下,对于连续的字符串常量,C++会要求编译器将其连起来,比如"a" "b"和"ab"没有区别。

此外,对于多个连续声明的字符串常量,只要有一个有前缀,则编译器会将这些连续的字符串常量都以此前缀处理。(实际上vs2017并不允许)

此外,C++11还支持"\u十六进制码位"表示unicode字符。

std::string  str = "\u4F60\u597d";	//中文字符:你好

而想要正确显示一个字符(不乱码),要求输入编码格式、文件存储编码格式,编译时选择的编码格式、以及输出显示编码格式四者一致才能正确,否则都会出现乱码的现象。

二、对于Unicode库的支持

1.单码位转换

        size_t mbrtoc16(char16_t * pc16, const char * s, size_t n, mbstate_t * ps);size_t c16rtomb(char * s, char16_t c16, mbstate _t * ps);size_t mbrtoc32(char32_t * pc32, const char * s, size_t n, mbstate_t * ps);size_t c32rtomb(char * s, char32_t c32, mbstate_t * ps);

mb表示multiple bytes,这四个函数都表示单码位的转换。

#include <climits>
#include <clocale>
#include <cuchar>
#include <iomanip>
#include <iostream>
#include <string>int main()
{std::setlocale(LC_ALL, "en_US.utf8");std::u16string strv = u"zß水🍌"; // or z\u00df\u6c34\U0001F34Cstd::cout << "Processing " << strv.size() << " UTF-16 code units: [ ";for (char16_t c : strv)std::cout << std::showbase << std::hex << static_cast<int>(c) << ' ';std::cout << "]\n";std::mbstate_t state{};char out[MB_LEN_MAX]{};for (char16_t c : strv){std::size_t rc = std::c16rtomb(out, c, &state);std::cout << static_cast<int>(c) << " converted to [ ";if (rc != (std::size_t) - 1)for (unsigned char c8 : std::string{ out, rc })std::cout << +c8 << ' ';std::cout << "]\n";}
}
#include <clocale>
#include <cstring>
#include <cuchar>
#include <cwchar>
#include <iomanip>
#include <iostream>int main()
{std::setlocale(LC_ALL, "en_US.utf8");std::string str = "z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"std::cout << "Processing " << str.size() << " bytes: [ " << std::showbase;for (unsigned char c : str)std::cout << std::hex << +c << ' ';std::cout << "]\n";std::mbstate_t state{}; // zero-initialized to initial statechar16_t c16;const char *ptr = &str[0], *end = &str[0] + str.size();while (std::size_t rc = std::mbrtoc16(&c16, ptr, end - ptr + 1, &state)){std::cout << "Next UTF-16 char: " << std::hex<< static_cast<int>(c16) << " obtained from ";if (rc == (std::size_t) - 3)std::cout << "earlier surrogate pair\n";else if (rc == (std::size_t) - 2)break;else if (rc == (std::size_t) - 1)break;else{std::cout << std::dec << rc << " bytes [ ";for (std::size_t n = 0; n < rc; ++n)std::cout << std::hex << +static_cast<unsigned char>(ptr[n]) << ' ';std::cout << "]\n";ptr += rc;}}
}

2.多码位转换

        std::codecvt<char, char, std::mbstate_t>          // 完成多字节与char之间的转换std::codecvt<char16_t, char, std::mbstate_t>      // 完成UTF-16与UTF-8间的转换std::codecvt<char32_t, char, std::mbstate_t>      // 完成UTF-32与UTF-8间的转换std::codecvt<wchar_t, char, std::mbstate_t>       // 完成多字节与wchar_t之间的转换

以及派生codecvt_utf8、codecvt_utf16、codecvt_utf8_utf16等可以用于字符串转换的模板类。这些模板类配合C++11定义的wstring_convert模板,可以进行一些不同字符串的转换。

三、原生字符串字面量支持

C++11开始支持原生字符串字面量,语法是R"(string)".

#include <iostream>int main()
{std::cout << "12345\t\n890" << std::endl;std::cout << R"(12345\t\n890)" << std::endl;
}

输出:

12345
890
12345\t\n890

而原生字符串字面值也可以添加前缀u,u8,U等表示字符编码内容:

	std::cout << uR"(12345\t\n890)" << std::endl;std::cout << UR"(12345\t\n890)" << std::endl;std::cout << u8R"(12345\t\n890)" << std::endl;

输出:

006DEBE4
006DEB3C
12345\t\n890

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

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

相关文章

边缘端部署的典型目标识别网络

边缘端&#xff08;Edge&#xff09;部署深度学习目标检测网络通常涉及到在资源受限的设备上执行模型推断。这里有一些边缘端部署深度学习目标检测网络的常见策略和技术&#xff1a; 轻量化模型&#xff1a; 选择或设计轻量级的深度学习模型&#xff0c;例如MobileNet、Squeez…

来自OpenAI的官方解释:ChatGPT中的GPTs与Assistants API的区别是什么?有什么差异?

本文原文来自DataLearnerAI的官方网站&#xff1a; 来自OpenAI的官方解释&#xff1a;ChatGPT中的GPTs与Assistants API的区别是什么&#xff1f;有什么差异&#xff1f; | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051701996595465 OpenAI发布的产…

图解算法数据结构-LeetBook-查找01_第一个只出现一次的字符

某套连招动作记作仅由小写字母组成的序列 arr&#xff0c;其中 arr[i] 第 i 个招式的名字。请返回第一个只出现一次的招式名称&#xff0c;如不存在请返回空格。 示例 1&#xff1a; 输入&#xff1a;arr “abbccdeff” 输出&#xff1a;‘a’ 示例 2&#xff1a; 输入&…

3D Web轻量引擎HOOPS Communicator如何实现对大模型的渲染支持?

除了读取轻松外&#xff0c;HOOPS Communicator对超大模型的支持效果也非常好&#xff0c;它可以支持30GB的包含70万个零件和3.5亿个三角面的Catia装配模型&#xff01; 那么它是如何来实现对大模型的支持呢&#xff1f; 我们将从以下几个方面与大家分享&#xff1a;最低帧率…

python核心阶段(五)—— 面向对象三大特性

1.封装 概念&#xff1a;封装主要是指将一些属性和相关方法封装在一个对象中&#xff0c;对外隐藏内部具体实现细节 作用&#xff1a;1&#xff09;使用起来更加方便&#xff0c;类似于提供了一个工具箱 2&#xff09;保证数据的安全&#xff08;设置私有属性&#xff09; 3&am…

高精度加法,减法,乘法,除法(下)(C语言)

前言 上一篇博客我们分享了高精度加法&#xff0c;减法,这一期我将为大家讲解高精度乘法和高精度除法。那让我们开始吧&#xff01; 对加法和减法感兴趣的话就点我 文章目录 1&#xff0c;乘法2&#xff0c;除法3&#xff0c;尾声 1&#xff0c;乘法 让我们想想我们平时做数学…

openpyxl读取Excel文件忽略单元格公式仅读取所显示的值

目录 前言解决方案先不加&#xff1a;看读取信息加上参数&#xff1a;看读取信息完整代码 前言 我们在读取Excel文件时&#xff0c;假如某行或者某列是利用公式生成的&#xff0c;但是我们在利用openpyxl进行读取时&#xff0c;发现读取到的是公式&#xff0c;而非显示的值 解…

Java并行和并发有什么区别?

Java并行和并发有什么区别&#xff1f; 并行和并发是两个在多线程编程中经常使用的概念&#xff0c;它们描述了不同的多任务处理方式。 并发&#xff08;Concurrency&#xff09;&#xff1a; 定义&#xff1a;并发是指多个任务共享资源&#xff0c;但是并不一定同时执行。它强…

pipe函数、SIGCHLD、execvp

pipe函数 以下是一个使用C语言编写的通过管道&#xff08;pipe&#xff09;进行进程间通信的示例代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h>int main() {int pipefd[2];pid_t pid;char b…

[⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记

前言 DPD 数字预失真技术&#xff0c;是一种用于抑制功率放大器非线性失真的方法。 它通过在信号输入功率放大器&#xff08;PA&#xff09;之前插入一个预失真模块&#xff0c;对输入信号进行适当的调制&#xff0c;以抵消功率放大器引起的非线性失真&#xff0c;使功率放大器…

Ubuntu 安装 CUDA 和 cuDNN 详细步骤

我的Linux系统背景&#xff1a; 系统和驱动都已安装。 系统是centos 8。查看自己操作系统的版本信息&#xff1a;cat /etc/issue或者是 cat /etc/lsb-release 用nvidia-smi可以看到显卡驱动和可支持的最高cuda版本&#xff0c;我的是12.2。驱动版本是535.129.03 首先&#…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-9阈值选取-机器视觉中应用正态分布和6-sigma

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-数学基础Ch0-9阈值选取-机器视觉中应用正态分布和6-sigma 5M1E——造成产品质量波动的六因素 人 Man Manpower 机器 Machine 材料 Material 方法 Method 测量 Measurment 环境 Envrionment DMAI…

RESTful 服务的开发

目录 1.RESTful风格介绍2.使用 RESTful 风格设计的用户管理 Web API 的示例代码13.RESTful 风格设计的用户管理 Web API 的示例代码2 1.RESTful风格介绍 RESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序的…

模块电源(六):前馈电容

一、前馈电容&#xff1a; 前馈电容是与电阻分压的顶部电阻 并联的"可选电容器" 二、计算及仿真&#xff1a; 1、计算 无前馈电容时&#xff0c;输出电压&#xff1a;&#xff1b;有前馈电容时&#xff0c;输出电压&#xff1a;&#xff0c;(其中&#xff0c;&am…

Java工程找不到javax.xml.bind.annotation包

文章目录 问题解决方法参考 问题 最近Java工程找不到javax.xml.bind.annotation包&#xff0c;进行了解决。 解决方法 参考 stackoverflow: package javax.xml.bind.annotation does not exist error javax.xml.bind这个库从Java 11版本就被移除了&#xff0c;缺失了这个包…

crmeb本地开发配置代理

crmeb 是一个开源的商城系统&#xff0c; v5 版本是一个前后端分离的项目&#xff0c; 我们从git仓库中下载下来的是一个文件夹&#xff0c;其结构是这样的 我的系统没有使用docker &#xff0c;使用的是 laragon 的系统 所以首先我们要在 nginx 中配置 之后&#xff0c; 我们…

WebStorm:Mac/Win上强大的JavaScript开发工具

WebStorm是JetBrains公司开发的针对Mac和Windows系统的JavaScript开发工具。它为开发者提供了一站式的代码编辑、调试、测试和版本控制等功能&#xff0c;帮助你更高效地进行Web开发。新版本的WebStorm 2023在性能和用户体验方面都做出了重大改进&#xff0c;让你的JavaScript开…

为什么感染HPV的人越来越多?劲松中西医结合医院专家发表看法

近年来&#xff0c;HPV感染率在我国呈现上升趋势&#xff0c;引起了社会的广泛关注。HPV是一种人乳头瘤病毒&#xff0c;主要通过性接触传播&#xff0c;也是引起宫颈癌的主要原因之一。那么&#xff0c;为什么我国的HPV感染率如此高呢&#xff1f; 首先&#xff0c;我们需要了…

深度学习疲劳检测 驾驶行为检测 - python opencv cnn 计算机竞赛

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习加…

远程服务器QEMU+Ubuntu+GRUB+VNC最佳实践

远程服务器QEMUUbuntuGRUBVNC最佳实践 1. 准备2. QEMU启动安装Ubuntu2.1 服务器端2.2 本地端 3. 从服务器终端控制虚拟机GRUB与虚拟机终端 这段时间参与大量内核切换测试工作&#xff0c;实体机需要硬件自检太过笨重&#xff0c;因此主要通过QEMU验证正确性。有一个很大的问题是…