【问题标题】:Why is my program handling Character Encoding incorrectly?为什么我的程序处理字符编码不正确?
【发布时间】:2020-02-07 06:11:18
【问题描述】:

我编写了我认为非常简单、非常基本的代码来吐出 Unicode 字符以及底层字节。

public class UnicodeTesting {
    public static void main(String[] args) {
        System.out.println(System.getProperty("java.version"));
        String header = "\u2554\u2550";
        for(byte b : header.getBytes()) {
            System.out.printf("%02X ", b);
        }
        System.out.println();
        System.out.println(header);
    }
}

当我在 OnlineGDB.com 上运行这段代码时,我得到了我期望的输出。

1.8.0_201
E2 95 94 E2 95 90 
╔═

但是,当我在本地的 Eclipse IDE 中运行完全相同的代码时,我得到了非常不同的结果:

1.8.0_131
3F 3F 
??

为什么会这样?


如果我在 Eclipse 方面编辑代码,我至少可以通过强制 getBytes 方法使用 UTF-8 编码来获得我期望的字节值:

import java.io.UnsupportedEncodingException;

public class UnicodeTesting2 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println(System.getProperty("java.version"));
        String header = "\u2554\u2550";
        for(byte b : header.getBytes("UTF-8")) {
            System.out.printf("%02X ", b);
        }
        System.out.println();
        System.out.println(header);
    }
}

1.8.0_131
E2 95 94 E2 95 90 
??

(我假设我的控制台根本不支持这些字符,所以我不担心它们会出错)

但这并不能解释为什么这两种环境中程序的文字行为不同,在一种环境中默认为 UTF-8,但在 Eclipse 中默认为 ASCII(我假设)。

【问题讨论】:

    标签: java unicode character-encoding


    【解决方案1】:

    根据 Java String 文档:

    getBytes()
    使用平台的默认字符集将此字符串编码为字节序列,将结果存储到新的字节数组中。

    getBytes(string charsetName)
    使用给定的字符集将此字符串编码为字节序列,将结果存储到新的字节数组中。

    在您的系统上,默认字符集不是 UTF-8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2013-11-28
      • 1970-01-01
      相关资源
      最近更新 更多