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



有两个不同的字节数组。当我从 byte[] 获取字符串时。当我使用 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);
    }

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

如果你查看 Javadoc 中你正在使用的 String 构造函数,它会说

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

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

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

最新更新