一、简述

与大多数编程语言相同,正则表达式里使用”\”作为转义字符,这就可能造成反斜杠困扰。
原生字符串(Raw String)指不进行转义“所见即所得”的字符串。很多编程语言早已支持原生字符串,如C#、Python、Shell等。C++作为一门高级程序设计语言,自然不能自甘落后,从C++11开始,C++也开始支持原生字符串。
C++的语法格式如下:
(1)字符串前加R前缀;
(2)字符串首尾加上小括号;

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

二、原生字符串与Unicode字符串结合

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

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. cout<<u8R"(\u4F60,\n
  6. \u597D)"<<endl;
  7. cout << u8R"(你好)" << endl;
  8. cout << sizeof(u8R"(hello)") << "\t" << u8R"(hello)" << endl;
  9. cout << sizeof(uR"(hello)") << "\t" << uR"(hello)" << endl;
  10. cout << sizeof(UR"(hello)") << "\t" << UR"(hello)" << endl;
  11. }

输出结果:

  1. \u4F60,\n
  2. \u597D
  3. 你好
  4. 6 hello
  5. 12 00C03174
  6. 24 00C03180

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

三、原生字符串的连接

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

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. char string[] = R"(你好)"R"(=hello)";
  6. char u8u8string[] = u8R"(你好)"u8R"(=hello)";
  7. //char u8ustring[] = u8R"(你好)"uR"=hello"; //编译报错
  8. cout << string<< endl;
  9. cout << u8string << endl;
  10. cout << sizeof(string) << endl;
  11. cout << sizeof(u8u8string) << endl;
  12. return 0;
  13. }
  14. //程序编译选项:g++ -finput-charset=utf-8 test.cpp

输出结果:

  1. 你好=hello
  2. 你好=hello
  3. 13
  4. 13