2013-03-25 39 views
4

我遇到了“char变量是Unicode格式,但是也可以很好地采用/映射到ASCII”。有什么需要提及的?当然,ASCII是1个字节,Unicode是2.而Unicode本身包含ASCII码(默认 - 它是标准)。那么是否有一些语言支持UNICODE而不支持ASCII?我们可以在ASCII和Unicode之间切换

此外,字符格式(Unicode/ASCII)由我们使用的平台决定,对吧? (UNIX,Linux,Windows等)。所以假设我的平台使用ASCII,是不可能切换到Unicode或反之亦然?

回答

5

Java在内部使用Unicode。总是。实际上,它大部分时间都使用UTF-16,但现在这样的细节太多了。

它可以不是在内部使用ASCII(例如String)。您可以可以表示任何可以用ASCII表示的字符串,所以这不应该是一个问题。

只有平台进入的地方是Java在您没有指定时必须选择编码的地方。例如,创建FileWriter以将String值写入字符串时:此时Java需要使用编码来指定如何将特定字符映射到字节。如果您不指定,则使用平台的默认编码。那个默认的编码是几乎从来没有ASCII。大多数Linux平台使用UTF-8,Windows 通常使用一些ISO-8859- *派生(或其他文化特定的8位编码),但是没有当前的操作系统使用ASCII(仅仅因为ASCII不能代表很多重要的字符)。

事实上,现在纯ASCII几乎是不相干的:没有人使用它。 ASCII仅为作为大多数8位编码(包括UTF-8)的映射的常见子集很重要:较低的128个Unicode码位在许多编码中以1:1映射到数字值0-127。但纯粹的ASCII(其中值128-255是未定义)不再处于活动使用状态。

+0

其实Windows只是Unicode,只是提供了一些使用遗留代码页的传统API。那些不应该再使用,即使许多程序做错了。 – Joey 2013-03-25 08:37:46

2

Unicode是ASCII的严格超集(对于这个问题拉丁语1),至少关于字符集合。与字节级的实际编码不太相关。所以不能有支持Unicode但不支持ASCII的语言/环境。上面这句话的意思是,如果你只处理ASCII文本,它就可以正常工作,因为如前所述,Unicode是ASCII的超集。

此外,为了澄清一些你的误解:

  1. “ASCII为1个字节和Unicode是2” - ASCII是7位代码,使用1个字节为每个字符。字节和字符因此在ASCII中是相同的(这是不幸的,因为理想上字节只是数据和文本是字符,但我离题了)。 Unicode是一个21位代码,它定义了代码点(数字)到字符的映射。如何表示这些数字取决于编码。 UTF-32是一种固定宽度编码,其中每个Unicode代码点表示为32位代码单元。 UTF-16是Java使用的,每个代码点使用两个或四个字节(一个或两个代码单元)。但是,这是每代码单元的16位,而不是每个代码点或实际字符(在Unicode意义上)。然后是使用8位代码单元的UTF-8,并将代码点表示为一个,两个,三个或四个代码单元。

  2. 对于Java而言,至少该平台在它是否只支持ASCII或Unicode方面没有任何说法。 Java总是使用Unicode,并且代表UTF-16代码单元(可以是半字符),而不是代码点(这将是字符),因此有点误导性地命名。您可能指的是Unix在几个环境变量中将语言,语言环境和首选系统编码相结合的传统。也就是说,您可以拥有一个系统,在该系统中,首选编码指定的遗留编码和盲目使用的应用程序可能存在问题。这并不意味着您无法在此类系统上构建支持Unicode的应用程序。毕竟,iconv必须以某种方式工作。