/Zc:u8EscapeEncoding (u8 文字列での数値エスケープ シーケンス エンコード)

数値エスケープ シーケンスの値は、utf-8 としてエンコードせずに u8 文字列リテラルに保持します。

このスイッチを使用して、クロス互換性を高めるか、utf-8 以外の文字が utf-8 文字列リテラルに埋め込まれている場合に使用します。

Syntax

/Zc:u8EscapeEncoding[-]

Remarks

C++ では、 u8 文字列リテラルは utf-8 でエンコードされた char8_tシーケンスです。 このフラグは、 u8 文字列リテラルでの数値エスケープ シーケンスの解釈方法を変更します。 /Zc:u8EscapeEncodingの動作は、文字列内でそれらを単一の 8 ビット char8_t値としてエンコードすることです。 /Zc:u8EscapeEncoding-の動作は、値を Unicode コード ポイントとして解釈することです。 値が Unicode の上位のコード ポイントである場合、マルチバイト文字としてエンコードされます。 ユニバーサル文字シーケンスの動作は、常に、 /Zc:u8EscapeEncoding[-]に関係なく utf-8 としてエンコードすることです。

次の例には、16 進エスケープ シーケンス \x とユニバーサル エスケープ シーケンス \u の両方が含まれています。 /Zc:u8EscapeEncoding[-] は 16 進エスケープ シーケンスのエンコードに影響しますが、ユニバーサル エスケープ シーケンスは常に utf-8 としてエンコードされます。 この例の文字列には、utf-8 で 0x20 としてエンコードされたスペース文字も含まれています。

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

/Zc:u8EscapeEncodingでは、エスケープ シーケンス\x00ff0xFFとしてエンコードされ、ユニバーサル文字シーケンス \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 (準拠)