C++ 源文件编码或执行字符集是否会更改wchar\t内部保存的方式?
以下是我对VC++C++ 源文件编码或执行字符集是否会更改wchar\t内部保存的方式?,c++,C++,以下是我对VC++/source字符集和/execution字符集的全部了解 因此,有3件事我需要保持不变(如果有任何错误,请纠正我): 源文件编码 /source字符集设置(确定编译器将如何解释我的源文件) /execution字符集设置(确定编译器如何将阶段2中的“输出内容”解释为可执行文件 因此,如果我使用encodingA保存源文件,则将/source charset和/execution charset设置为encodingA,并使用codewchar_t c=L'é;或char16_
/source字符集
和/execution字符集
的全部了解
因此,有3件事我需要保持不变(如果有任何错误,请纠正我):
encodingA
保存源文件,则将/source charset
和/execution charset
设置为encodingA
,并使用codewchar_t c=L'é;
或char16_t c=u'é
或char32_t c=u'é
程序是否会根据我在“解释”过程中选择的编码a
更改的编码单位
或者,é
的代码单位永远不会改变,无论我选择什么编码
(不要担心控制台输出)在源文件中写入wchar_t c=L'é“
时,需要以某种方式将其转换为原始字节,保存源文件时使用的编码将影响é
的编码
显然,用于存储源文件的编码应该与编译器的源字符集设置相匹配。编译器会逐字读取源文件,并根据配置的编码解释其内容
就像你在UTF-8中保存了“é”
,然后在ISO-8859-1中重新阅读,你会看到“Ô)
但是,如果您在ISO-8859-1中保存“é”
,并在UTF-8中读回,则可能会出现错误的编码错误或返回到其他编码
这取决于您在源文件中使用的非ASCII字符。如果只使用拉丁语-1,则最好将源存储在Windows-1252中(或您的区域设置的默认编码),因为MSVC在不存在BOM的情况下将源字符集默认为该字符集。这样,您就不需要指定任何/source字符集
如果您不仅使用拉丁字符,或者想要最大的可移植性,最好使用UTF-8,并将/UTF-8
标志传递到cl.exe
,这是/source charset:UTF-8/execution charset:UTF-8
/source charset
的缩写,指示如何将Unicode作为字节存储在di上的源文件中代码编辑器知道é
是Unicode代码点U+00E9,并将其相应地编码到文件中(0xE9
在拉丁语-1中,0xC3 0xA9
在UTF-8中,等等)
当编译器读取源文件时,它使用指定的/source charset
将文件字节转换为Unicode,然后根据需要处理Unicode数据。在此阶段,如果使用正确的/source encoding
,以便正确解码文件字节,则将作为Unicode cod读回epoint U+00E9,并且在下一步之前不会在任何特定编码中进行处理
如果代码中未指定其他编码,则/execution字符集
指示可执行文件中保存的Unicode数据的编码方式。在示例中不适用,因为L
/u
/u
前缀指示编码方式(L
=UTF-16或UTF-32,取决于平台,u
=UTF-16,u
=UTF-32)。因此:
如果您使用的是char
,则/execution charset
将适用:
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
除非对UTF-8使用u8
前缀:
char c = u8'é'; // illegal!
const char *s8 = u8"é", // 0xC3 0xA9
@我的问题和那个问题一样难……我不确定。我在读C++的时候,事情很粗略,但是很明显你在看一个Visual Studio具体的答案。My MSVC很弱,所以我要闭嘴走开。也许有点离题,但是如果你想在你的源文件中存储非ASCII字符,那么我强烈地回想。mmend将它们存储为UTF-8.UTF-16(例如,除非您另有说明,否则VisualStudio倾向于使用UTF-8.UTF-16)第三方工具不理解UTF-16会造成各种各样的痛苦。你的文件也会变小。UTF-16作为数据交换格式实际上只在Redmond中使用。@PaulSanders是的,我知道。但是VS使用的是与系统区域相关的代码页编码,而不是UTF-16。我有点坚信。没有主流平台使用UTF-16 a我认为s文本文件的默认编码非常有用!在某种程度上证明了我的推论。还有一件事我想要求澄清:因此在可执行文件中,L'e'
或u
仍将是0xE9 0x00或0xE9 0x00 0x00
,并且无论是什么codepag,这个内部代码单元都不会受到影响使用e(字符集),从头到尾都是“硬编码”的,对吗?顺便问一下,/source charset
和/execution charset
设置是否适用于所有编译器或仅适用于VC++编译器?L
代表“编译器为wchar\u t选择的任何编码”,形式上甚至可以是ASCII或ISO-8859-x。在这个问题的上下文中,MSVC将始终选择UTF-16。@MSalterswchar\u t
主要是2字节(Windows)或4字节(大多数其他平台)。使用这些大小的编译器不会为其选择这些字符集
char c = u8'é'; // illegal!
const char *s8 = u8"é", // 0xC3 0xA9