如何用Unicode编写程序?

时间:2012-08-16 20:32:42

标签: java unicode character-encoding javac

来自Java Specification SE 7 Edition

§3.1 Unicode

  

使用Unicode字符集编写程序。

§3.2词汇翻译

  

将原始Unicode字符流转换为序列   令牌,使用以下三个词汇翻译步骤...

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

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

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

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

Converting Non-Unicode Text

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

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