自C++11始,你可以定义 raw string(原始/未加工字符串) 和 multibyte /wide-character(多字节/宽字符)等字符串字面常量。
Raw String Literal
Raw string 允许我们定义字符序列,做法是:确切的写下其内容使其成为一个raw character sequence(原始字符序列)。于是你可以省下很多用来装饰特殊字符的escape符号。
Raw string 以 "R( 开头以 )" 结尾,可以内 line break(换行符)。例如一个用来表示”两个反斜线和一个n“的寻常字符常量可以定义如下:
"\\\\n"
也可定义为如下 raw string literal:
R"(\\n)"
如果要在 raw string内写出 )",可以使用 delimiter (定义符)。因此,一个 raw string 的完整语法是
Raw "delim(...)delim",其中 delim 是个字符序列,最多16个基本字符,不可含反斜线,空格,和小括号。
例如 如下raw string literal:
R"nc(a\
b\nc()"
)nc";
等同于寻常 string literal:
"a\\\n b\\nc()\"\n "
这样的 string 内含一个a,一个反斜线,一个新行字符,若干空格,一个b,一个反斜线,一个n,一个c,一对小括号,一个双引号,一个新行号,以及若干空格。
在定义正则表达式时,raw string literal 特别有用。
编码的(Encoded )String Literal
只要使用编码前缀,你就可以为string literal 定义一个特殊的字符编码。下面这些编码前缀都预先定义好了:
u8 定义一个UTF-8编码。UTF-8 string literal 以UTF-8编订的某个给定字符起头,字符类型为 const char。
u 定义一个 string literal,带着类型为 char16_t 的字符。
U 定义一个 string literal,带着类型为char32_t 的字符。
L 定义一个 wide string literal ,带着类型为 wchar_t 的字符。
例如:
L"HELLO"; //定义一个类型为 wchar_t 的string literal字符“HELLO”
Raw string 开头那个R前面还可以放置一个编码前缀。