2

来自 Java 规范 SE 7 版

§3.1统一码

程序是使用 Unicode 字符集编写的。

§3.2词法翻译

使用以下三个词法翻译步骤将原始 Unicode 字符流翻译成标记序列...

我很困惑,因为我使用本机字符编码(Windows-1252)编写源代码,并且规范提到(?)都从原始 Unicode 字符流开始,然后执行词法转换(包括 Unicode 转义转换) .

他们提到 Unicode 转义可用于包含仅使用 ASCII 字符的任何 Unicode 字符;如果执行了先前的转换,我认为它们指的是 Unicode 字符集子集中的 ASCII 字符,这是有道理的。

是否有从用于将源文件写入 Unicode 的编码的先前转换?

一些相关信息,但我认为这更像是运行时的文本处理,而不是编译过程:

转换非 Unicode 文本

4

2 回答 2

4

基本上,规范所说的是您只能在源文件中使用 Unicode 字符。它没有定义这些字符如何实际编码为字节,这取决于您和您正在使用的平台。

基本上编译器内部发生的事情是从磁盘读取源文件作为字节流,然后将这些字节转换为 Java 的 Unicode 字符的内部表示。它将源文件的原始字节转换为 Unicode 字符的方式基于-encoding传递给javac. 如果未-encoding设置任何选项,它将使用您平台的默认编码。

现在还需要注意的是,在编译器将源代码字节转换为字符之后,它会执行另一个步骤来将字符文字(例如\u00a5123)转换为适当的单个 Unicode 字符。这实际上是您在问题中引用的第 3.2 节中引用的三个步骤中的第一个。这样就可以只使用纯 ASCII 字符来表示源中的任何 Unicode 字符。

于 2012-08-16T20:59:48.863 回答
2

“Unicode”不是一种编码,它只是一个字符列表和相关数字(或“代码点”),但与传统字符集不同,数字不是 Unicode 字符的磁盘表示。要编码或解码 Unicode 字符,您需要一个单独的编码,它将字节序列映射到 Unicode 数字,从而映射到 Unicode 字符。

一些编码,如 UTF-8,旨在对所有可能的 Unicode 代码点进行编码。其他的,如 Windows CP 1252,只能表示一小部分 Unicode 字符。但是任何有效的 Windows CP 1252 数据仍然可以解码为有效的 Unicode 代码点序列。

所以,是的,存在从磁盘表示到虚拟 Unicode 字符流的转换。

于 2012-08-16T21:08:18.660 回答