java 编码问题

时间:2024-10-08 10:30:47

今天遇到了一个诡异的问题,用类似下面的代码,对不同的字符串区md5时得到的结果竟然一样,

public static void main(String[] args) {
    String s1 = DigestUtils.md5DigestAsHex("你好呀".getBytes());
    String s2 = DigestUtils.md5DigestAsHex("你好呢".getBytes());
    System.out.println(s1);
    System.out.println(s2);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出

0d1b08c34858921bc7c662b228acb7ba
0d1b08c34858921bc7c662b228acb7ba
  • 1
  • 2

排查了一下应该是字符串编码的问题,一般linux机器上默认的编码时ISO8859, 导致信息丢失,所以在转byte时指定字符串的编码就好了

public static void main(String[] args) {
    //无参getBytes一般使用系统默认编码,如果正好系统是ISO8859,而你又要处理中文,就会出现问题,换成utf8就没问题了
    String s1 = DigestUtils.md5DigestAsHex("你好呀".getBytes(StandardCharsets.UTF_8));
    String s2 = DigestUtils.md5DigestAsHex("你好呢".getBytes(StandardCharsets.UTF_8));
    System.out.println(s1);
    System.out.println(s2);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8