在网上搜索后,我现在知道我的问题的答案。因此,我将尝试为任何想知道在 c++ 中处理转义序列的机制的人解释它。
当您在文件上编写代码时,您指定文件字符集(Windows-1252
, ISO-8859-1
, UTF-8
, UTF-16
, UTF-16BE
, UTF-16LE
...),它将文件中的字符映射到其对应的代码点,然后使用您指定的字符集进行编码到流要保存在硬盘上的字节数。
当您尝试编译源代码文件时,如果您没有使用-finput-charset=option
编译器选项指定文件编码,编译器将假定您的文件使用UTF-8
. 在这两种情况下,首先要做的C PreProcessor (CPP)
就是将您的文件转换为源字符集,即 UTF-8。
CPP 完成后,字符串和字符常量再次转换为执行字符集,默认情况下它与源字符集 UTF-8
匹配,但您可以使用-exec-charset=option
编译器选项更改它。到目前为止,一切都很清楚,我们没有谈论转义序列,因为它们的处理方式不同。
当字符串从源字符集转换为执行字符集时,有两种转义序列的处理方式不同。第一种是octal or hexadecimal
转义序列like \xA1 or \45
,第二种是escape sequence that get represented using a backslash followed by a character
like \r or \n
。
八进制和十六进制转义序列值独立于执行字符集,这意味着它们不会从源字符集转换为执行字符集,例如,无论当前执行字符集\xA1
如何,都具有该值。
剩余的转义序列值取决于执行字符集,例如将首先映射到源字符集中的对应字符,在这种情况下,它会在然后转换为执行字符集,例如,如果用户已设置,则将在源字符集中字符集然后A1
'\n'
0A
UTF-8
-fexec-charset=UTF-16BE
'\n'
0A
00 0A
源之后执行字符集转换。
Line Feed 转义字符\n
甚至取决于平台,在 Windows 操作系统中,输出库将替换\n=0A
为\r\n=10 0A
,在 Unix 中它将保留\n=0A
。请注意,这种替换发生在字符和字符串从source charset
to转换之后execution charset
,否则我们会得到不同的结果。