java - 程序是如何用 Unicode 编写的?

标签 java unicode character-encoding javac

来自 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 的先前转换?

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

Converting Non-Unicode Text

最佳答案

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

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

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

关于java - 程序是如何用 Unicode 编写的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11995021/

相关文章:

string - 从字符串中提取单个 unicode 字符

character-encoding - Fortran 字符串数组

java - 无法添加窗口 - token null 不适用于广播接收器 OnReceive 内的应用程序

java - 在Transformer中,如何指定被转换的类的类型是相同类型的?

java - Java 指令包

unicode - U+215F(分数分子一)有什么用?

java - 奇怪的 Java Webstart JNLP 异常

python - 删除日志文件中的 ^L 字符

visual-c++ - 是否可以仅使用 Windows API 将 UTF32 文本转换为 UTF16?

ruby - 删除 ruby 中奇怪的无效字符