6

我遇到了“char 变量是 Unicode 格式,但也很好地采用 / 映射到 ASCII”。这有什么必要提的?当然 ASCII 是 1 个字节,Unicode 是 2 个字节。Unicode 本身包含 ASCII 代码(默认情况下 - 它是标准)。那么是否有一些语言中的char变量支持 UNICODE 但不支持 ASCII?

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

4

2 回答 2

9

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

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

平台发挥作用的唯一地方是当您没有指定编码时,Java 必须选择一种编码。例如,当您创建一个FileWriterString值写入字符串时:此时 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未定义)不再有效使用。

作为旁注,Java 9 有一个称为“紧凑字符串”的内部优化,其中仅包含可在 Latin-1 中表示的字符的字符串使用每个字符而不是 2 个字节。这种优化对于各种“计算机语言”非常有用像 XML 和类似协议,其中大部分文本都在 ASCII 范围内。但它对开发人员也是完全透明的,因为所有处理都是在String类内部完成的,从外部看不到。

于 2013-03-25T08:19:48.020 回答
2
于 2013-03-25T08:14:19.767 回答