Java:utf8中不同的byte []具有相同的字符串

时间:2018-12-27 05:07:41

标签: java string utf-8 byte

有两个不同的字节数组。当我从byte []获取String时,当我使用utf8时它们具有相同的值。当我使用ISO-8859-1时相反。

    byte[] valueFir = new byte[]{0, 1, -79};
    byte[] valueSec = new byte[]{0, 1, -80};

    Charset CHARSET = Charset.forName("ISO-8859-1");
    Charset UTF8SET = Charset.forName("UTF-8");
    Charset[] list = new Charset[]{CHARSET, UTF8SET};

    for(int i=0; i<list.length; i++){

        String fir = new String(valueFir,list[i]);
        String sec = new String(valueSec,list[i]);

        Assert.assertNotEquals(fir,sec);
    }

第一个断言为真,第二个断言为失败。 是什么原因?

1 个答案:

答案 0 :(得分:4)

如果您看到Javadoc for the String constructor that you're using,它会说

  

此方法始终使用此字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列。

现在在UTF8中,字节-79和-80不再映射到单个字符。因此,两个字节数组在UTF8中都没有意义。而且由于它们不可映射,因此您只获得了两次默认的String。然后,您的assertNotEquals将默认的String与自身进行比较。

但是,您的字节数组在ISO-8859-1中非常有意义,并且可以转换为两个不同的String值。