源文件编码或执行字符集是否会更改wchar_t在内部保存的方式?

时间:2018-05-31 19:48:32

标签: c++

以下是关于VC ++ /source-charset/execution-charset的所有事情(https://docs.microsoft.com/en-us/cpp/build/reference/source-charset-set-source-character-set)。

所以有三件事我需要保持不变(如果有什么不对,请纠正我):

  1. 源文件编码
  2. / source-charset设置(确定编译器如何解释我的源文件)
  3. / execution-charset设置(确定编译器如何解释"输出内容"从第2阶段到可执行文件。
  4. 因此,如果我使用encodingA保存源文件,请将/source-charset/execution-charset设置为encodingA,并设置代码wchar_t c = L'é';char16_t c = u'é';char32_t c = U'é'

    程序是否会更改é的代码单元,具体取决于我在"解释"中选择的encodingA

    或者é的代码单元永远不会改变,无论我选择什么编码?

    (不要担心控制台输出)

2 个答案:

答案 0 :(得分:4)

/source-charset指示如何将Unicode作为字节存储在磁盘上的源文件中,仅此而已。代码编辑器知道é是Unicode代码点U + 00E9,并将其编码为相应的文件(在Latin-1中为0xE9,在UTF-8中为0xC3 0xA9等。)

当编译器读取源文件时,它会使用指定的/source-charset将文件的字节转换为Unicode,然后根据需要处理Unicode数据。在此阶段,如果使用正确的/source-encoding以便正确解码文件的字节,则é将作为Unicode代码点U + 00E9读回,并且不会以任何特定编码处理,直到下一个步骤

如果代码中未指定其他编码,则/execution-charset指示将Unicode数据的编码保存为可执行文件。它不适用于您的示例,因为L / u / U前缀指示编码(L = UTF-16或UTF-32,具体取决于平台,{ {1}} = UTF-16,u = UTF-32)。所以:

U

如果您使用的是wchar_t wc = L'é'; // 0xE9 0x00 or 0xE9 0x00 0x00 0x00 char16_t c16 = u'é'; // 0xE9 0x00 char32_t c32 = U'é'; // 0xE9 0x00 0x00 0x00 ,则适用char

/execution-charset

除非使用UTF-8的char c = 'é'; // MAYBE 0xE9 or other single-byte value, or a multi-byte overflow warning/error const char *s = "é"; // MAYBE 0xE9 or other single-byte value, or maybe 0xC3 0xA9 前缀:

u8

答案 1 :(得分:2)

在源文件中编写wchar_t c = L'é';时,需要以某种方式将其转换为原始字节,保存源文件时使用的编码将影响é的编码。

显然,用于存储源文件的编码应该与编译器的源字符集设置相匹配。编译器按字面意思读取源文件,并根据配置的编码解释其内容。

就像您在UTF-8中保存'é'并在ISO-8859-1中回读一样,您就会看到'é'

但是如果您在ISO-8859-1中保存'é'并以UTF-8回读,则会出现错误的编码错误或其他编码的回退。

这取决于您在源文件中使用的非ASCII字符。如果只有latin-1,那么最好将源存储在Windows-1252中(或者任何默认编码用于您的语言环境),因为MSVC默认源字符集为没有BOM时。然后,您不需要指定任何/source-charset

如果您不仅使用拉丁字符,或者您希望获得最大的可移植性,最好使用UTF-8并将/utf-8标记传递给cl.exe,这是{{1}的简写}。