为什么我的Java Charset.defaultCharset()GBK而不是Unicode?

时间:2013-05-17 06:33:53

标签: java unicode utf-8 character-encoding

配置: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默认字符集?是Unicode吗? Java默认如何 charset与程序员互动?例如,如果Java使用Unicode, 那么一个字符串" abc"因为它们不能编码到其他字符集中 与俄罗斯,Frence等的字符集不同, 因为它们是完全不同的编码方法。
  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源代码的charset 码?

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

4 个答案:

答案 0 :(得分:2)

Check the doc“默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统的区域设置和字符集。”所以不,默认字符集是不一定是Unicode。

在OpenJDK中,它是根据file.encoding属性确定的。另见Setting the default Java character encoding?

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


虽然默认字符集与操作系统相关,但编译的Java类中的字符串始终存储为UTF-16。

* .java源代码的编码是您为Java编译器指定的任何内容,如果未提供,则为OS的默认编码。请参阅Java compiler platform file encoding problem


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

答案 1 :(得分:1)

  1. 默认字符集是Java将用于将字节转换为字符或字符串的字符集(反之亦然)如果您未指定其他任何内容(例如,如果您创建一个{ {3}}和InputStreamReader)。
  2. don't pass an explicit charset返回...默认的字符集。究竟是什么依赖于实现,但通常就是操作系统在相同情况下使用的内容。
  3. 这个设置正是你的Java安装所使用的:“中文”意味着必须提供一些处理中文字符的编码,并且GBK匹配就好了。
  4. 编译Java源文件时可以指定它(使用Charset.defaultCharset())。如果明确指定它,那么Java将使用平台默认编码(参见#1)。

答案 2 :(得分:0)

  

什么是JAVA默认字符集?

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

  

是Unicode吗?

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

  

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

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

  

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

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

  

Charset.defaultCharset()返回什么?

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

  

它是否返回我的WIN8默认字符集?

因为这是应该做的。如果操作系统的字符集无法映射到Java或未正确映射到Java,则只会出现问题。如果它是相同的,一切都很好。

  

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

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

  

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

就本问题而言,不涉及任何编码。只有字符不需要编码才能制作字符,因为它们已经是字符。

  

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

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

  

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

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

答案 3 :(得分:0)

我不确定这是否有帮助。要在Eclipse中更改编码: --- Project Explorer ---右键单击Java文件 ---跑来跑去 ---运行配置 ---共同(标签) ---编码(在Linux中默认设置为UTF-8

相关问题