当前位置: 首页 > 知识库问答 >
问题:

如何用Unicode编写程序?

江超英
2023-03-14

来自Java规范SE 7版

§3.1 Unicode

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

§3.2词汇翻译

使用以下三个词法翻译步骤,将原始Unicode字符流转换为一系列标记。。。

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

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

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

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

转换非Unicode文本

共有2个答案

刘绍晖
2023-03-14

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

有些编码,如UTF-8,是为编码所有可能的Unicode码位而设计的。其他的,像Windows CP 1252,只能表示Unicode字符的一个小的子集。但是任何有效的Windows CP 1252数据仍然可以被解码成有效的Unicode码位序列。

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

叶英哲
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我想用Python编写一个Android应用,将.py文件转换为APK。 问题答案: 要点:首先,APK不仅仅是压缩字节码(例如,应用程序清单,资源等),实际上还有很多其他功能,因此谈论将Python文件“转换”为APK并没有多大意义。 。 其次,我不鼓励这样做。我强烈建议改用Xamarin Forms,Cordova,Java或Xamarin.Android。Xamarin Form

  • 配置tensorflow后,我尝试运行命令 但发生了一个错误,我尽了一切可能,但未能解决。 错误:跳过“//tensorflow/cc:tutorials\u example\u trainer”:加载包“tensorflow/cc”时出错:在读取扩展文件“cuda/build\u defs”时遇到错误。bzl':没有这样的包“@local_config_cuda//cuda”:回溯(最后一次调用

  • 问题内容: 我正在尝试为Linux编写Mono C#守护程序。 我想在它完成处理时开始和停止它,而不只是取消该过程。 有人有这个例子吗? 编辑:我想出了如何在debian中使用start-stop-daemon –background,所以我想现在就使用它。 编辑:我也在Java中实现这一点,他们有这个不错的addShutdownHook可以捕获终止应用程序。我需要花更多时间来整理单声道服务的依赖

  • 问题内容: 我正在学习如何编写存储过程。我知道了,但我没有。我知道事情是这样的。 因此,我被困住了,我试图理解的是。编写一个存储过程,该过程接受一个Territory ID,Territory Description和Region ID,并将它们作为新行插入Northwind的Territories表中。 好吧,我知道我可以做这样的事情,我相信: 但是那我可能是错的。但我不知道在哪里插入然后作为表

  • 问题内容: 我想用Java编写unicode文字U + 10428。 http://www.marathon- studios.com/unicode/U10428/Deseret_Small_Letter_Long_I 我尝试使用“ \ u10428”,但无法编译。 问题答案: 由于Java在人们认为64K足以满足所有人的需求时就采用了全面的unicode(以前在哪听过?),他们从UCS-2开始

  • 问题内容: 我并不是要特别解决任何问题,而是要努力学习球衣。 我有一个标记为这样的实体类: 以及相应的球衣服务 给出正确的XML响应。假设我想编写一个MessageBodyWriter,它复制相同的行为,并产生一个XML响应,我该怎么做? 通过使用@Provider批注进行标记,我可以看到邮件正文编写器已正确调用。 当调用writeTo时,对象o是一个Vector,类型GenericType是一个