以下是关于VC ++ /source-charset
和/execution-charset
的所有事情(https://docs.microsoft.com/en-us/cpp/build/reference/source-charset-set-source-character-set)。
所以有三件事我需要保持不变(如果有什么不对,请纠正我):
因此,如果我使用encodingA
保存源文件,请将/source-charset
和/execution-charset
设置为encodingA
,并设置代码wchar_t c = L'é';
或char16_t c = u'é';
或char32_t c = U'é'
,
程序是否会更改é
的代码单元,具体取决于我在"解释"中选择的encodingA
或者é
的代码单元永远不会改变,无论我选择什么编码?
(不要担心控制台输出)
答案 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}的简写}。