/Zc:u8EscapeEncoding(u8 字符串中的数值转义序列编码)

将数值转义序列的值保留在字符串文本中 u8 ,而不将它们编码为 utf-8。

使用此开关可以提高交叉兼容性,或者在 utf-8 字符串文本中嵌入非 utf-8 字符时。

Syntax

/Zc:u8EscapeEncoding[-]

Remarks

在 C++ 中,u8字符串字面量是由 char8_t 构成的 UTF-8 编码序列。 此标志会更改在 u8 字符串字面量中解释数字转义序列的方式。 在 /Zc:u8EscapeEncoding 下,其行为是将它们编码为字符串中的单个 8 位 char8_t 值。 下面的 /Zc:u8EscapeEncoding- 行为是将值解释为 unicode 代码点。 当该值是 Unicode 中的较高代码点时,它将编码为多字节字符。 通用字符序列的行为始终是将其编码为 UTF-8,而不受 /Zc:u8EscapeEncoding[-] 的影响。

以下示例包含十六进制转义序列 \x 和通用转义序列 \u/Zc:u8EscapeEncoding[-] 影响十六进制转义序列的编码,但通用转义序列始终编码为 utf-8。 示例字符串还包括空格字符,该字符编码为 0x20 utf-8。

#include <cstdio>
int main()
{
    const char8_t str[] = u8" \x00ff \u00ff ";
    for(char8_t c : str) {
        printf("0x%X ", c);
    }
    return 0;
}

/Zc:u8EscapeEncoding 中,转义序列 \x00ff 被编码为 0xFF,而通用字符序列 \u00ff 被编码为 UTF-8 序列 0xC3 0xBF。 代码示例输出:

0x20 0xFF 0x20 0xC3 0xBF 0x20 0x0

/Zc:u8EscapeEncoding- 下,\x00ff\u00ff 的值都会被重新编码为 UTF-8 序列 0xC3 0xBF。 代码示例输出:

0x20 0xC3 0xBF 0x20 0xC3 0xBF 0x20 0x0

另见

/Zc (一致性)