17-其他形式的字符串字面值
4.3.5 其他形式的字符串字面值
本书前面说过,除char类型外,C++还有类型wchar_t;而C++11新增了类型char16_t和char32_t。可创建这些类型的数组和这些类型的字符串字面值。对于这些类型的字符串字面值,C++分别使用前缀L、u和U表示,下面是一个如何使用这些前缀的例子:
wchar_t title[] = L"Chief Astrogator"; // w_char string
char16_t name[] = u"Felonia Ripova"; // char_16 string
char32_t car[] = U"Humber Super Snipe"; // char_32 string
C++11还支持Unicode字符编码方案UTF-8。在这种方案中,根据编码的数字值,字符可能存储为1~4个八位组。C++使用前缀u8来表示这种类型的字符串字面值。
C++11新增的另一种类型是原始(raw)字符串。在原始字符串中,字符表示的就是自己,例如,序列\n不表示换行符,而表示两个常规字符——斜杠和n,因此在屏幕上显示时,将显示这两个字符。另一个例子是,可在字符串中使用",而无需像程序清单4.8中那样使用繁琐的\"。当然,既然可在字符串字面量包含",就不能再使用它来表示字符串的开头和末尾。因此,原始字符串将"(和)"用作定界符,并使用前缀R来标识原始字符串:
cout << R"(Jim "King" Tutt uses "\n" instead of endl.)" << '\n';
上述代码将显示如下内容:
Jim "King" Tutt uses "\n" instead of endl.
如果使用标准字符串字面值,将需编写如下代码:
cout << "Jim \"King\" Tutt uses \" \\n\" instead of endl." << '\n';
在上述代码中,使用了\来显示\,因为单个\表示转义序列的第一个字符。
输入原始字符串时,按回车键不仅会移到下一行,还将在原始字符串中添加回车字符。
如果要在原始字符串中包含)",该如何办呢?编译器见到第一个)"时,会不会认为字符串到此结束?会的。但原始字符串语法允许您在表示字符串开头的"和(之间添加其他字符,这意味着表示字符串结尾的"和)之间也必须包含这些字符。因此,使用R"+(标识原始字符串的开头时,必须使用)+"标识原始字符串的结尾。因此,下面的语句:
cout << R"+*("(Who wouldn't?)", she whispered.)+*" << endl;
将显示如下内容:
"(Who wouldn't?)", she whispered.
总之,这使用"+(和)+"替代了默认定界符"(和)"。自定义定界符时,在默认定界符之间添加任意数量的基本字符,但空格、左括号、右括号、斜杠和控制字符(如制表符和换行符)除外。
可将前缀R与其他字符串前缀结合使用,以标识wchar_t等类型的原始字符串。可将R放在前面,也可将其放在后面,如Ru、UR等。
下面介绍另一种复合类型——结构。