2

配置:Windows 8 英文操作系统;JDK1.7;蚀。

我安装了一个中文写的软件,GUI是汉字。但该软件显示丑陋的方形框。我搜索了互联网并找到了修复它的方法。在Win8的控制面板中,将“非Unicode程序的语言”设置为“中文”。

但是在 Eclipse 中编写代码时会出现问题。我们知道 Java 本身使用两个字节的 Unicode 来存储charString. 但是当我执行以下代码时:

import java.util.Arrays;
import java.nio.charset.Charset;

public class CharSetTest {
    public static void main(String[] args) throws Exception {
        System.out.println(Charset.defaultCharset());
        String s = "哈哈";

        byte[] b3 = s.getBytes("UTF-8");
        System.out.println(b3.length);
        System.out.format("%X %X %X\n", b3[0],b3[1],b3[2]);
        System.out.println(new String(b3));

        byte[] b4 = s.getBytes();
        System.out.format("%X %X %X\n", b4[0],b4[1]);
    }
}

输出很奇怪:

GBK          //default charset is GBK, not Unicode or UTF-8  
3            //this is obvious since a Chinese character is encoded into 3 bytes  
E5 93 88     //this is corresponding UTF-8 code number  
鍝?          //something wrong here  
B9 FE        //I think s.getBytes() should use JAVA's default encode "Unicode", but NOT is this case  

几个问题:

  1. 什么是 Java 默认字符集?是统一码吗?Java 默认字符集如何与程序员交互?例如,如果 Java 使用 Unicode,则字符串“abc”不能编码为其他字符集,因为它们与 Unicode 不同,例如俄罗斯、法国等的字符集,因为它们是完全不同的编码方法。
  2. 返回什么Charset.defaultCharset()?它会返回我的 Windows 8 的默认字符集吗?
  3. 如何Charset.defaultCharset()返回GBK?我没有在我的 Windows 8 相关默认字符集中设置任何东西,除了控制面板中的“非 Unicode 程序的语言”。
  4. 如果我这样在Java中声明一个String:,String str = "abc";我不知道charset/encoding的过程。我首先需要通过键盘输入 Java 语句。键盘如何将我的按键转换为 Java Unicode 字符集?String str 存储在我的 .java 源代码文件中。存储 Java 源代码的字符集是什么?

编辑
为什么我们说“Java 使用 Unicode 来表示字符和字符串”?在我的 Java 程序中,我什么时候应该关心 Unicode 的事情?通常,我只需要关心使用 UTF-8 ISO-8859-1 GBK 等进行编码/解码。但我从不关心 char 和 String 的 Unicode 表示。那么我应该如何以及何时使用 Unicode?

4

4 回答 4

2

检查文档“默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统的语言环境和字符集。” 所以不,默认字符集不一定是 Unicode。

在 OpenJDK 中,它是由file.encoding属性确定的。另请参阅设置默认 Java 字符编码?.

使用* GetUserDefaultLCID()函数获取默认file.encoding值(在 Windows 上),该函数对应于“区域和语言选项”中的设置。这就是返回 GBK 的原因,因为您将语言环境设置为中文。Charset.defaultCharset()


尽管默认字符集取决于操作系统,但编译的 Java 类中的字符串始终存储为 UTF-16。

*.java 源代码的编码是您指定给 Java 编译器的任何编码,或者如果未提供操作系统的默认编码。请参阅Java 编译器平台文件编码问题


*:参见http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/windows/native/java/lang/java_props_md.c,第 577 行。

于 2013-05-17T07:06:17.513 回答
1
  1. 如果您没有指定其他任何内容(例如,如果您创建 aInputStreamReader并且不传递显式 charset ) ,则默认字符集是 Java 将用于将字节转换为 chars 或 Strings(反之亦然)的字符集。
  2. Charset.defaultCharset()返回...默认字符集。究竟是什么取决于实现,但通常正是操作系统在相同情况下使用的内容。
  3. 该设置正是您的 Java 安装所使用的:“中文”意味着必须提供一些处理中文字符的编码,并且 GBK 匹配得很好。
  4. Java 源文件的编码可以在编译时指定(使用参数-encoding。如果您没有明确指定它,那么 Java 将使用平台默认编码(参见 #1)。
于 2013-05-17T07:05:04.933 回答
0

我不确定这是否有帮助。在 Eclipse 中更改编码:---项目资源管理器---右键单击 Java 文件---运行方式---运行配置---通用(选项卡)---编码(在 Linux 中设置为 UTF-8默认

于 2015-03-09T08:57:34.070 回答
0

什么是 JAVA 默认字符集?

它是从您操作系统中的默认设置中提取的。这可能是 Windows-1252-???

是统一码吗?

这不是字符集。字符集定义了如何将字符编码为字节。

JAVA默认字符集如何与程序员交互?

这是您未指定字符集时使用的默认值。

例如,如果 JAVA 使用 Unicode,则字符串“abc”不能编码为其他字符集,因为它们与俄罗斯、法国等的 Unicode 字符集不同,因为它们是完全不同的编码方法。

Java 在内部使用 UTF-16,但您不需要知道这一点。这对大多数语言都没有问题,除了一些汉语方言需要使用代码点。

Charset.defaultCharset() 返回什么?

它做它看起来做的事情。您可以通过阅读此方法的 javadoc 来确认这一点。

它会返回我的 WIN8 的默认字符集吗?

因为那是它应该做的。只有当您的操作系统的字符集无法映射到 Java 或未正确映射到 Java 时,您才会遇到问题。如果它是相同的,一切都很好。

Charset.defaultCharset() 如何返回 GBK。我没有在我的 WIN8 相关的默认字符集中设置任何东西,除了控制面板中的“非 Unicode 程序的语言”。

这是因为 Java 认为您为 Windows 设置了这个。要更正此问题,您必须在 Windows 中使用正确的字符集。

如果我在java中声明一个String,如:String str =“abc”;,我不知道charset/encoding的过程。

就这个问题而言,不涉及任何编码。只有字符不需要编码来生成字符,因为它们已经是字符。

键盘如何将我的按键转换为 Java Unicode 字符集?

键盘不行。它只知道你按了哪些键。操作系统将这些键转换为字符。

String str 存储在我的 .java 源代码文件中。存储java源代码的字符集是什么?

这是由进行存储的编辑器决定的。很可能它将再次成为操作系统默认值,或者如果您更改它,您可能会将其设为 UTF-8。

于 2013-05-17T07:04:20.927 回答