字符串字符由编译器解释

时间:2014-11-20 04:35:08

标签: c++ character-encoding

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  

ISO / IEC 14882:2003(E)

     

2.1.1翻译阶段

     

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

     

...

     

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