C++17中utf-8 character literal的使用

2023-11-19

      一个形如42的值被称作字面值常量(literal),这样的值一望而知。每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。

      由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值

      字符串字面值的类型实际上是由常量字符构成的数组(array)。编译期在每个字符串的结尾处添加一个空字符(‘\0’),因此,字符串字面值的实际长度要比它的内容多1。例如,字面值’A’表示的就是单独的字符A,而字符串”A”则代表了一个字符的数组,该数组包含两个字符:一个是字母A,另一个是空字符。

      如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一个整体。当书写的字符串字面值比较长,写在一行里不太合适时,就可以采取分开书写的方式。

      有两类字符不能直接使用:一类是不可打印(nonprintable)的字符,如退格或其它控制字符,因为它们没有可视的图符;另一类是在C++语言中有特殊含义的字符(单引号、双引号、问号、反斜线)。在这些情况下需要用到转义序列(escape sequence),转义序列均以分斜线作为开始,C++语言规定的转义序列包括如下图所示:在程序中,下述转义序列被当作一个字符使用

      我们也可以使用泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。

      注:如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列。相反,\x要用到后面跟着的所有数字。因为大多数机器的char型数据占8位,超过8位的可能会报错。

      指定字面值的类型列表如下:

      注:以上内容主要整理自《C++ Primer(Fifth Edition)》

      测试代码如下所示:

int test_literal_2()
{
	char c = 'a'; // 字符字面值
	char str[] = "hello world"; // 字符串字面值

	std::cout << "csdn address: "
		"https://blog.csdn.net/fengbingchun/;	"
		"github address: "
		"https://github.com/fengbingchun"<< std::endl;

	std::cout << "\12" << "\0" << "\115" << "\40" << "\x4d" << "\n";
	std::cout << "Hi \x4dO\115!\n"; // Hi MOM!
	std::cout << "\1154\n"; // M4
	//std::cout << "\x1234\n"; // error C2022: “4660”: 对字符来说太大

	auto x1 = L'a'; // 宽字符型字面值,类型是wchar_t
	auto x2 = u8"Hi"; // utf-8字符串字面值(utf-8用8位编码一个Unicode字符)
	auto x3 = U"Bei";
	std::cout << "x1 type:" << typeid(x1).name()
			  << ", x2 type:" << typeid(x2).name()
			  << ", x3 type:" << typeid(x3).name() << "\n"; // x1 type:wchar_t, x2 type:char const * __ptr64, x3 type:char32_t const * __ptr64

	return 0;
}

      在C++17中增加了以u8开头的字符字面值(character literal),在以前的C++版本中,字符字面值的可用选择仅限于相对较小的ASCII字符集,C++17中支持的字符字面值涵盖了所有可用的Unicode字符。

      字符串字面值的编码前缀(encoding-prefixes)有五种:none, L, u8, u, U,但在C++17之前,字符字面值的编码前缀有四种:none, L, u, U,缺少u8。

      为了通过字符字面值表示Unicode字符,可以使用转义序列\u连接字符代码的十六进制表示,也可以使用转义序列\U。

      在字符字面值和本机(native)字符串字面值中,任何字符都可以用通用字符名(universal character name)表示。通用字符名由前缀\U后跟八位Unicode码组成,或者由前缀\u后跟四位Unicode码组成。必须分别提供所有八位或四位数字,才能形成格式正确的通用字符名。

      测试代码如下所示:

int test_literal_17_1()
{
	char c1 = u8'A'; // C++17
	char c2[2] = u8"A";

	char u1 = 'A';          // 'A'
	char u2 = '\101';       // octal, 'A'
	char u3 = '\x41';       // hexadecimal, 'A'
	char u4 = '\u0041';     // \u UCN 'A'
	char u5 = '\U00000041'; // \U UCN 'A'

	return 0;
}

      GitHubhttps://github.com/fengbingchun/Messy_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++17中utf-8 character literal的使用 的相关文章

  • C和C++安全编码笔记:整数安全

    5 1 整数安全导论 整数由包括0的自然数 0 1 2 3 和非零自然数的负数 1 2 3 构成 5 2 整数数据类型 整数类型提供了整数数学集合的一个有限子集的模型 一个具有整数类型的对象的值是附着在这个对象上的数学值 一个具有整数类型的
  • C语言中的弱符号与强符号介绍

    弱符号 Weak symbol 是链接器 ld 在生成ELF Executable and Linkable Format 缩写为ELF 可执行和可链接格式 是一种用于可执行文件 目标文件 共享库和核心转储的标准文件格式 ELF文件有两种索
  • C++/C++11中头文件algorithm的使用

  • C++11中模板类std::enable_shared_from_this的使用

    C 11中的模板类template
  • C和C++安全编码笔记:动态内存管理

    4 1 C内存管理 C标准内存管理函数 1 malloc size t size 分配size个字节 并返回一个指向分配的内存的指针 分配的内存未被初始化为一个已知值 2 aligned alloc size t alignment siz
  • 在Ubuntu 18.04上支持C++17的std::filesystem的方法

    在Ubuntu 18 04上通过命令sudo apt install gcc g 安装的gcc g 版本为7 5 此版本并不直接支持filesystem 如下图所示 Ubuntu 18 04上的g 7 5支持experimental的fil
  • 程序员的自我修养--链接、装载与库笔记:可执行文件的装载与进程

    可执行文件只有装载到内存以后才能被CPU执行 1 进程虚拟地址空间 程序和进程有什么区别 程序 或者狭义上讲可执行文件 是一个静态的概念 它就是一些预先编译好的指令和数据集合的一个文件 进程则是一个动态的概念 它是程序运行时的一个过程 很多
  • C和C++安全编码笔记:文件I/O

    C和C 程序通常会对文件进行读写 并将此作为它们正常操作的一部分 不计其数的漏洞正是由这些程序与文件系统 其操作由底层操作系统定义 交互方式的不规则性而产生的 这些漏洞最常由文件的识别问题 特权管理不善 以及竞争条件导致 8 1 文件I O
  • C和C++安全编码笔记:并发

    并发是一种系统属性 它是指系统中几个计算同时执行 并可能彼此交互 一个并发程序通常使用顺序线程和 或 进程的一些组合来执行计算 其中每个线程和进程执行可以在逻辑上并行执行的计算 这些进程和 或 线程可以在单处理器系统上使用分时抢占式的方式
  • Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲 Effective C More Effective C Effective STL 这三本书出版已很多年 后来又出版了Effective Modern C More Effective
  • Linux下遍历指定目录的C++实现

    之前在 https blog csdn net fengbingchun article details 51474728 给出了在Windows遍历指定文件夹的C 实现 这里给出在Linux下遍历目录的实现 Windows和Linux下的
  • C语言中signal函数简介及使用

    signal h是C标准函数库中的信号处理部分 定义了程序执行时如何处理不同的信号 信号用作进程间通信 报告异常行为 如除零 用户的一些按键组合 如同时按下Ctrl与C键 产生信号SIGINT C 中的对应头文件是csignal C语言标准
  • 提高C++性能的编程技术笔记:引用计数+测试代码

    引用计数 reference counting 基本思想是将销毁对象的职责从客户端代码转移到对象本身 对象跟踪记录自身当前被引用的数目 在引用计数达到零时自行销毁 换句话说 对象不再被使用时自行销毁 引用计数和执行速度之间的关系是与上下文紧
  • C++中的内存对齐介绍

    网上有很多介绍字节对齐或数据对齐或内存对齐的文章 虽然名字不一样 但是介绍的内容大致都是相同的 这里以内存对齐相称 注 以下内容主要来自网络 内存对齐 通常也称为数据对齐 是计算机对数据类型合法地址做出了一些限制 要求某种类型对象的地址必须
  • 程序员的自我修养--链接、装载与库笔记:Linux共享库的组织

    共享库 Shared Library 概念 其实从文件结构上来讲 共享库和共享对象没什么区别 Linux下的共享库就是普通的ELF共享对象 由于共享对象可以被各个程序之间共享 所以它也就成为了库的很好的存在形式 很多库的开发者都以共享对象的
  • C++11中std::bind的使用

    std bind函数是用来绑定函数调用的某些参数的 std bind它可以预先把指定可调用实体的某些参数绑定到已有的变量 产生一个新的可调用实体 它绑定的参数的个数不受限制 绑定的具体哪些参数也不受限制 由用户指定 std bind 1 将
  • json11库的使用

    JSON JavaScript Object Notation 是一种轻量级的文本数据交换格式 易于让人阅读 同时也易于机器解析和生成 尽管JSON是Javascript的一个子集 但JSON是独立于语言的文本格式 并且采用了类似于C语言家
  • C++14中返回类型推导的使用

    使用C 14中的auto返回类型 编译器将尝试自动推导 deduce 返回类型 namespace int xx 1 auto f return xx return type is int const auto f3 return xx r
  • C++中vector的使用

    向量std vector是一种对象实体 能够容纳许多各种类型相同的元素 包括用户自定义的类 因此又被称为序列容器 与string相同 vector同属于STL Standard Template Library 中的一种自定义的数据类型 可
  • C++中nothrow的介绍及使用

    在C中 使用malloc等分配内存的函数时 一定要检查其返回值是否为 空指针 并以此作为检查内存操作是否成功的依据 这种Test for NULL代码形式是一种良好的编程习惯 也是编写可靠程序所必需的 在C 中new在申请内存失败时默认会抛

随机推荐

  • java面向对象 final && static 关键字

    目录 关键字 static 类属性 类方法的设计思想 类变量 class Variable 静态变量的内存解析 类方法 class method 单例 Singleton 设计模式 理解main方法的语法 代码块 关键字 final 总结
  • LTE MIB&SIB1

    LTE MIB SIB1 LTE MIB SIB 消息可以参考 http blog csdn net wowricky article details 51348613 UE 接受完MIB SIB1后就可以判断这个CELL是否可以驻留 这里
  • Unix and perl primer for Biologists - Part2 :Advanced Unix- Reading Notes(U37-U45)

    U37 Counting with grep Running grep c simply counts how many lines match the specified pattern root kali Downloads Unix
  • Linux内核调度算法 -- CPU时间片如何分配

    内核在微观上 把CPU的运行时间分成许多分 然后安排给各个进程轮流运行 造成宏观上所有的进程仿佛同时在执行 双核CPU 实际上最多只能有两个进程在同时运行 大家在top vmstat命令里看到的正在运行的进程 并不是真的在占有着CPU哈 所
  • FPGA_时钟显示(时钟可调)

    1 实验说明 在数码管显示数据的基础上 让六位数码管显示数字时钟 并且通过按键可以对时间进行修改 实验目标 六位数码管分别显示时间的时分秒 且通过按键可实现加减调整时间及清零功能 key1 切换键 选择待调整的时间单位 时 分 秒 key2
  • 2021-09-18

    Idea控制台中文乱码解决 Dfile encoding gb2312
  • HBase跨版本数据迁移总结

    本文首发腾云阁 HBase跨版本数据迁移总结 某客户大数据测试场景为 Solr类似画像的数据查出用户标签 通过这些标签在HBase查询详细信息 以上测试功能以及性能 其中HBase的数据量为500G Solr约5T 数据均需要从对方的集群人
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II(java+python)

    在一个数组 nums 中除一个数字只出现一次之外 其他数字都出现了三次 请找出那个只出现一次的数字 示例 1 输入 nums 3 4 3 3 输出 4 示例 2 输入 nums 9 1 7 9 7 9 7 输出 1 限制 1 lt nums
  • 宝塔面板 创建 二级域名 Unable to round-trip http request to upstream

    1 我的服务器是阿里云 安装了宝塔面板 直接使用宝塔面板创建二级域名bike caowei wang 2 然后就想访问了 对不起 直接给你报错Unable to round trip http request to upstream dia
  • 第二届网刃杯--部分Re

    1 freestyle ida中分析有个两个fun atoi 将字符转换为整数 得到答案为3327105 MD5加密提交 2 Re function 没有提供密码 但是在右边看到熟悉的89 50 利用winhex保存出来 得到解压密码 解压
  • 宝塔登录面板

    请使用正确的入口登录面板 错误原因 当前新安装的已经开启了安全入口登录 新装机器都会随机一个8位字符的安全入口名称 亦可以在面板设置处修改 如您没记录或不记得了 可以使用以下方式解决 解决方法 在SSH终端输入以下一种命令来解决 1 查看面
  • flutter 秒转时分秒

    参考 倒计时工具 class CountdownUtils 补零 static String zeroFill int i return i gt 10 i 0 i 秒转时分秒 static String second2HMS int se
  • 关系数据关联性分析实验

    1 散点图 基于ggplot内置数据mtcars 以mpg列为横坐标 以wt列为纵坐标 以cyl列分组控制颜色 绘制散点图 点的形状为三角形 大小为150 图的标题为 MPG VS WT from ggplot import data gg
  • 【RPA机器人】PDF批量转换成图片机器人

    运行前须知 1 仅支持win10系统 2 请确保安装金山PDF独立版 3 请把屏幕分辨率设置为1920x1080 缩放布局100 4 生成的图片将保存在所选文件夹目录下 运行流程 1 获取需批量转换PDF的文件夹 2 等待文件自动转换 运用
  • Python3中__call__方法介绍

    如果Python3类中有 call 方法 那么此类实例的行为类似于函数并且可以像函数一样被调用 当实例作为函数被调用时 如果定义了此方法 则x arg1 arg2 是x call arg1 arg2 的简写 为了将一个类实例当作函数调用 我
  • 如何实现一个分布锁?

    基本概念 为何需要分布式锁 传统环境中的情况 在程序开发过程中不得不考虑的就是并发问题 在java中对于同一个jvm而言 jdk已经提供了lock和同步等 但是在分布式情况下 往往存在多个进程对一些资源产生竞争关系 而这些进程往往在不同的机
  • 七. go 常见数据结构实现原理之 反射

    目录 一 golang 是如何实现反射的 如何比较两个对象完全相等 一 golang 是如何实现反射的 参考博客Go 语言问题集 Go Questions Go 语言在 reflect 包里定义了各种类型 实现了反射的各种函数 通过它们可以
  • 【Git系列】Git配置SSH免密登录

    Git配置SSH免密登录 1 设置用户名和邮箱 2 生成密钥 3 远程仓库配置密钥 2 免密登录 其他系列 Git最详细的体系化教程 在以上push操作过程中 我们第一次push时 是需要进行录入用户名和密码的 比较麻烦 而且我们使用的是h
  • 刷脸支付技术更多的是想要助力数字化运营

    刷脸支付是在原有的收银系统基础上增加一种收款方式 不影响收银系统 收银更有效 支付更便捷 体验感更好 节省时间成本 资金更安全 支付宝 微信官方为推广刷脸支付 两大官方投入巨额资金普及刷脸支付 日常生活中可避免忘记带手机 手机没电 通话中
  • C++17中utf-8 character literal的使用

    一个形如42的值被称作字面值常量 literal 这样的值一望而知 每个字面值常量都对应一种数据类型 字面值常量的形式和值决定了它的数据类型 由单引号括起来的一个字符称为char型字面值 双引号括起来的零个或多个字符则构成字符串型字面值 字