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

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

萧成文
2023-03-14

配置:Windows8英文操作系统;JDK1.7;日食。

我安装了一个中国人写的软件,GUI是汉字。但是软件用方框显示得很难看。我在网上搜索了一下,找到了一个修复它的方法。在Win8的控制面板中,将“非Unicode程序的语言”设置为“中文”。

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缺省字符集如何与程序员交互?例如,如果Java使用Unicode,那么字符串“ABC”不能编码到其他字符集中,因为它们不同于Unicode的字符集,如俄罗斯、法国等,因为它们是完全不同的编码方法。
  2. charset.defaultcharset()返回什么?它是否返回Windows 8的默认字符集?
  3. charset.defaultcharset()如何返回GBK?除了控制面板中的“非Unicode程序语言”之外,我没有在Windows 8相关的默认字符集中设置任何内容。
  4. 如果我在Java中像这样声明一个字符串:String str=“abc”;,我不知道charset/encoding的过程。我首先需要通过键盘输入Java语句。键盘如何将我的按键转换成Java Unicode字符集?字符串str存储在我的.java源代码文件中。存储Java源代码的字符集是什么?

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

共有1个答案

楚嘉胜
2023-03-14

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

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

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

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

 类似资料:
  • 我现在有一个helloworld项目根据这个链接,我做了它的。帽子 文件成功。我有“DE-ABCM_TB”读卡器和SAM卡。 我的小程序AID是 我可以在卡片上选择我的小程序。(我通过"DualCard"发送SELECT APDU命令 2.8版“/pcsc选项卡)。我现在必须在发送时接收十六进制格式的hello 。但我收到6C0B!为什么我会得到这样的回应 我如何解决这个问题?我搜索了一下,但没有

  • 当我运行(Windows 7命令行)时: C:\rest-app\src\main\java\com\mycompany\app\test>java org.testng.testng testng.xml Suite1运行的测试总数:0,失败:0,跳过:0 ================================================== 此时我的testng.xml文件如下所

  • 我与Wildfly和OpenJPA合作。我有一个乐观锁例外的情况。 我得到的错误消息是: 00:08:29373警告[com.arjuna.ats.arjuna](默认任务-39)arjuna01225:TwoPhaseCoordinator。beforeCompletion-SynchronizationImple失败 :org.apache.openjpa.persistence.乐观锁定异常

  • 我试图理解背后的动机。如果已经存在类型类和,为什么有必要呢? 诚然,的实例是具体的类型,而的实例需要一个类型参数。(有关有用的解释,请参见Monoid vs MonadPlus。)但是你不能重写任何类型的约束吗 作为和的组合? 从。它的实施是: 我只能使用和实现它: 有人能澄清和之间的真正区别吗?

  • 问题内容: 这一直使我感到困惑。看起来这样会更好: 比这个: 是否有特定原因? 问题答案: 这是因为任何可迭代对象都可以连接(例如,列表,元组,字典,集合),但是其内容和“连接器” 必须是 字符串。 例如: 使用字符串以外的其他东西会引发以下错误:

  • 我的讲师在课堂上问过我这个问题,我想知道为什么是宏而不是函数?