C++ 编译器对字符串的解释

C++ 编译器对字符串的解释,c++,character-encoding,C++,Character Encoding,让我们从C中的一个简单行开始++ char const* hello = "動画、読書な"; // I hope it is not offensive, I dont know what this means )) 并指出该行存储在utf-8编码文件中。 当我用此行传递文件时,编译结果是二进制代码,编译程序将执行以下步骤: 读取文件它需要知道什么是文件编码,在utf-8的情况下,使用BOM可能很容易,但是其他编码呢? 使用其语法解析文件内容,构建语法树。。。 如果一切正常,它将开始编写二进制

让我们从C中的一个简单行开始++

char const* hello = "動画、読書な"; // I hope it is not offensive, I dont know what this means ))
并指出该行存储在utf-8编码文件中。 当我用此行传递文件时,编译结果是二进制代码,编译程序将执行以下步骤:

读取文件它需要知道什么是文件编码,在utf-8的情况下,使用BOM可能很容易,但是其他编码呢? 使用其语法解析文件内容,构建语法树。。。 如果一切正常,它将开始编写二进制代码,在这个阶段,它将在代码中保存constans。 问题是它将如何存储上面的常数動画、読書な? 它是否以某种方式转换了它?
或者它只是读取字符后的字节,直到从文件中读取另一个字符并按原样存储?那么,这是否意味着最终的二进制代码取决于原始源文件编码?

源代码必须以实现定义的方式转换为ASCII,必要时使用转义序列保留原始编码中的字符:

ISO/IEC 14882:2003E

2.1.1翻译阶段

物理源文件字符以实现定义的方式映射到基本源 为行尾引入新行字符的字符集 如有必要,请提供指示灯。Trigraph序列2.3替换为 对应的单字符内部表示。任何来源 替换不在基本源字符集2.2中的文件字符 通过指定该字符的通用字符名。一 实现可以使用任何内部编码,只要实际 源文件中遇到扩展字符,并且相同 扩展字符,在源文件中表示为 处理通用字符名,即使用\uxxx表示法 相当于

15基本组成员的图示符 源字符集用于识别源代码中的字符 ISO/IEC 10646的子集,对应于ASCII字符集。 但是,由于源文件字符到源的映射 翻译阶段1中描述的字符集指定为 实现定义后,需要一个实现来记录如何 基本源字符在源文件中表示


这种行为只有在C++11的编译器中才能很好地定义。