来自 Java 规范 SE 7 版
§3.1 Unicode
Programs are written using the Unicode character set.
§3.2 词汇翻译
A raw Unicode character stream is translated into a sequence of tokens, using the following three lexical translation steps...
我很困惑,因为我使用 native 字符编码 (Windows-1252) 编写源代码,并且规范提到 (?) 全部从原始 Unicode 字符流开始,然后是词法翻译(包括 Unicode 转义转换) 进行。
他们提到 Unicode 转义符可用于包含任何 Unicode 字符,使用 仅 ASCII 字符;如果执行了先前的转换,我认为它们指的是 Unicode 字符集子集中的 ASCII 字符,这是有道理的。
是否有从用于写入源文件的编码到 Unicode 的先前转换?
一些相关信息,但我认为这更像是运行时的文本处理,而不是编译过程:
最佳答案
规范基本上是说您只能在源文件中使用 Unicode 字符。它没有定义这些字符实际上是如何编码成字节的,这取决于您和您所使用的平台。
基本上,编译器内部发生的事情是从磁盘读取源文件作为字节流,然后将这些字节转换为 Java 的 Unicode 字符的内部表示。它将源文件的原始字节转换为 Unicode 字符的方式基于传递给 javac
的 -encoding
选项。如果未设置 -encoding
选项,它将使用您平台的默认编码。
现在还需要注意的是,在编译器将源代码字节转换为字符之后,它会执行另一个步骤将字 rune 字(例如 \u00a5123
)转换为适当的单个 Unicode 字符。这实际上是您在问题中引用的第 3.2 节中引用的三个步骤中的第一步。这样就可以只使用纯 ASCII 字符来表示源代码中的任何 Unicode 字符。
关于java - 程序是如何用 Unicode 编写的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11995021/