当前位置: 首页 > news >正文

解读C++11 原生字符串

原生字符串(Raw String)指不进行转义“所见即所得”的字符串。很多编程语言早已支持原生字符串,如C#、Python、Shell等。C++作为一门高级程序设计语言,自然不能自甘落后,从C++11开始,C++也开始支持原生字符串。

很多时候,当我们需要一行字符串的时候,字符串转义往往成了一个负担,写和读都带了很大的不便。例如,对于如下路径”D:\workdataDJ\code\vas_pgg_proj”,我们必须通过反斜杠进行转义,把它写成如下形式:

1

string path ="D:\\workdataDJ\\code\\vas_pgg_proj";

可能你会说这个并没有多大影响,但当我们使用正则表达式时,由于正则表达式中特殊字符(如反斜杠、双引号等)较多,再使用反斜杠进行转义,那么正则表达式的可读性将变得很差,形如下面的一条正则表达式

string re = "('(?:[^\\\\']|\\\\.)*'|\"(?:[^\\\\\"]|\\\\.)*\")|";

在C#中,我们可以通过@关键字来取消字符串转义。在C++ 11中,它的非转义形式为:

1

string path = R"(D:\workdataDJ\code\vas_pgg_proj)";

从上面的例子中可以看出,C++的语法格式如下:

(1)字符串前加R前缀;
(2)字符串首尾加上小括号;

它的语法格式比C#的@前缀要稍微复杂点,不过这个复杂也有复杂的好处,那就是字符串里面可以带双引号。

1

string path = R"(this "word" is escaped)";

而C#就无法保持原始字符串格式,对双引号仍需要转义:

1

stringpath =@"this ""word"" is escaped";

2.原生字符串与Unicode字符串结合

由于C++11对Unicode的支持,原生字符串的定义方式可以与Unicode字符串结合使用,定义UTF-8、UTF-16和UTF-32的原生字符串,将其前缀分别设置为u8R、uR和UR即可。有一点需要注意,使用了原生字符串,转义字符就不能再使用了,这会给使用\u或者\U的方式书写Unicode字符的程序带来一定影响。参看下面的例子。

1

2

3

4

5

6

7

8

9

10

11

12

#include <iostream>

usingnamespacestd;

intmain()

{

cout<<u8R"(\u4F60,\n

\u597D)"<<endl;

cout << u8R"(你好)"<< endl;

cout <<sizeof(u8R"(hello)") <<"\t"<< u8R"(hello)"<< endl;

cout <<sizeof(uR"(hello)") <<"\t"<< uR"(hello)"<< endl;

cout <<sizeof(UR"(hello)") <<"\t"<< UR"(hello)"<< endl;

}

程序输出结果:

\u4F60,\n
\u597D
你好
6 hello
12 00C03174
24 00C03180

从结果可以看出,使用\u定义Unicode字符时,未能如果异常,输出原生字符串的模样。在使用sizeof运算符计算不同编码的相同字符串时,得到的结果是不通的,大小跟其申明的类型是完全一致的。注意在使用cout对UTF-16和UTF-8编码的字符串进行输出时,输出的是字符串地址。

3.原生字符串的连接

C++中同样可以将原生字符串进行连接,但不要将不同编码的字符串进行连接,因为C++尚不支持这种做法。考察如下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#include <iostream>

usingnamespacestd;

intmain()

{

charstring[] = R"(你好)"R"(=hello)";

charu8u8string[] = u8R"(你好)"u8R"(=hello)";

//char u8ustring[] = u8R"(你好)"uR"=hello"; //编译报错

cout << string<< endl;

cout << u8string << endl;

cout <<sizeof(string) << endl;

cout <<sizeof(u8u8string) << endl;

return0;

}

//程序编译选项:g++ -finput-charset=utf-8 test.cpp

代码输出结果如下:

你好=hello
你好=hello
13
13

可以看出,原生字符串会被编译器自动连接在一起,整个字符串“你好=hello”含有两个UTF-8编码的中文字符,共占6字节,和6个ASCII字符,再加上自动生成的空字符\0,字符串共占用13字节空间。UTF-8与UTF-16两种不同编码的字符在连接时,编译报错,C++目前还不支持这种写法,请避免。

http://www.jsqmd.com/news/722983/

相关文章:

  • 路由器1111111111
  • 2025_NIPS_Understanding the Expressive Power and Mechanisms of Transformer for Sequence Modeling
  • C 基础(16) - C 预处理和C库
  • 终极指南:如何用OnStep将普通望远镜升级为智能寻星系统
  • 手把手带你了解C++最小栈
  • 2026年3月靠谱的汽车增压器组件口碑推荐,欧曼增压器/船机增压器/7830增压器/工程机械增压器,汽车增压器供应商推荐 - 品牌推荐师
  • MIMO稀疏信道估计:MOMPnet算法与硬件损伤校准
  • 95%小白选手持喷码机的误区
  • 华硕笔记本性能调校终极指南:G-Helper完全替代Armoury Crate
  • 国网低压侧, 智能融合终端, 微应用基础库
  • 2025_NIPS_Table2LaTeX-RL: High-Fidelity LaTeX Code Generation from Table Images via Reinforced Mu...
  • 出轨小三就会净身出户?告诉你出轨离婚财产分割的5个真相
  • ARM架构异常处理与RAS特性深度解析
  • PHP开发的OA办公系统源码|集成CRM客户管理+ERP订单合同管理(PC端与移动端双平台)
  • 2026年惠州保安公司行业解析,惠州工厂保安公司服务优势与选择要点,帮你判断惠州哪家保安公司好 - 栗子测评
  • Proxmox VE (PVE):虚拟化神器,从0开始踩坑
  • 出海办公效率瓶颈凸显,跨应用AI办公助手如何打通跨境业务孤岛?
  • 如何快速实现老Mac升级:OpenCore Legacy Patcher终极指南
  • 抖音无水印视频下载终极指南:3分钟掌握免费高清资源获取秘籍
  • ARM虚拟化核心:HFGRTR_EL2寄存器详解与应用
  • 石墨烯地暖高频自动化设备哪家好?2026年石墨烯地暖高频自动化设备/医疗袋高频热合机厂家推荐权威盘点:华日金菱领衔 - 栗子测评
  • 2026年怎么挑商用和面机厂家?核心技术看这几点 - 优质品牌商家
  • ARM SPE性能分析:PMSIDR_EL1寄存器详解与实践
  • Coordinate IM 系统 - 企业即时通讯解决方案
  • 【教学类-160-14】20260425 AI视频培训-练习014“豆包AI视频《月下枯蔷(哥特风)》+豆包图片风格:油画”
  • ARMv8/v9异常处理与ESR_EL2寄存器深度解析
  • ContextFlow视频对象编辑技术解析与应用实践
  • Increasing Triplet Subsequence贪心解法分析
  • 2026微晶铝采购指南:如何识别服务好的供应商?半导体设备镜面铝/医疗设备镜面铝/微晶铝,微晶铝企业口碑推荐 - 品牌推荐师
  • UL94阻燃等级