编译器解释字符串字符

String characters interpretation by compiler

本文关键字:字符 字符串 解释 编译器      更新时间:2023-10-16

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

char const* hello = "動画、読書な"; // I hope it is not offensive, I dont know what this means ))

并指出此行存储在utf-8编码文件中。当我传递带有此行的文件进行编译(结果是二进制代码)时,编译执行以下步骤:

  1. 读取文件(它需要知道文件编码是什么,在 utf-8 的情况下,使用 BOM 可能很容易,但其他编码呢?
  2. 使用语法解析文件内容,构建语法树,...
  3. 如果一切正常,它开始编写二进制代码,在此阶段,它将常量保存在代码中。

问题是它将如何存储上面的常量("動画、読書な")?它会以某种方式转换它吗?或者它只是从文件中读取"字符直到另一个"之后的字节并按原样存储它们?那么这是否意味着最终的二进制代码取决于原始源文件编码?

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

ISO/IEC 14882:2003(E)

2.1.1 翻译阶段

物理源文件字符以实现定义的方式映射到基本源 字符集(为行尾引入换行符 指标)如有必要。三元组序列 (2.3) 替换为 相应的单字符内部表示形式。任何来源 替换不在基本源字符集 (2.2) 中的文件字符 通过指定该字符的通用字符名称。(一个 实现可以使用任何内部编码,只要实际 在源文件中遇到的扩展字符,并且相同 在源文件中表示为 处理通用字符名称(即使用 \uXXXX 表示法) 等效地。

15) 基本成员的字形 源字符集用于标识 ISO/IEC 10646 的子集,对应于 ASCII 字符集。 但是,因为从源文件字符到源文件的映射 字符集(在转换阶段 1 中描述)指定为 实现定义,需要实现来记录如何 基本源字符在源文件中表示。