Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 源文件编码或执行字符集是否会更改wchar\t内部保存的方式?_C++ - Fatal编程技术网

C++ 源文件编码或执行字符集是否会更改wchar\t内部保存的方式?

C++ 源文件编码或执行字符集是否会更改wchar\t内部保存的方式?,c++,C++,以下是我对VC++/source字符集和/execution字符集的全部了解 因此,有3件事我需要保持不变(如果有任何错误,请纠正我): 源文件编码 /source字符集设置(确定编译器将如何解释我的源文件) /execution字符集设置(确定编译器如何将阶段2中的“输出内容”解释为可执行文件 因此,如果我使用encodingA保存源文件,则将/source charset和/execution charset设置为encodingA,并使用codewchar_t c=L'é;或char16_

以下是我对VC++
/source字符集
/execution字符集
的全部了解

因此,有3件事我需要保持不变(如果有任何错误,请纠正我):

  • 源文件编码
  • /source字符集设置(确定编译器将如何解释我的源文件)
  • /execution字符集设置(确定编译器如何将阶段2中的“输出内容”解释为可执行文件
  • 因此,如果我使用
    encodingA
    保存源文件,则将
    /source charset
    /execution charset
    设置为
    encodingA
    ,并使用code
    wchar_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。@MSalters
    wchar\u t
    主要是2字节(Windows)或4字节(大多数其他平台)。使用这些大小的编译器不会为其选择这些字符集
    char c = u8'é'; // illegal!
    
    const char *s8 = u8"é",  // 0xC3 0xA9