java - 使用不同编码编码的两个不同字符串是否可以具有相同的字节序列?

标签 java encoding character-encoding hash

用不同编码编码的两个不同的字符串是否可以具有相同的字节序列? 即当使用两种不同的编码进行编码时,下面示例中的一些“字符串一”和“字符串二” (cp1252和UTF-8只是例子)会导致测试通过吗?

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

import org.junit.Assert;
import org.junit.Test;

public class EncodingTest {
    @Test
    public void test() throws UnsupportedEncodingException {
        final byte[] sequence1 = "string one".getBytes("Cp1252");
        final byte[] sequence2 = "string two".getBytes("UTF-8");
        Assert.assertTrue(Arrays.equals(sequence1, sequence2));
    }
}

我的代码中的一个错误使用 JVM 的默认编码对从 String 生成的字节序列进行哈希处理,我需要验证当代码使用不同的字符串和不同的 JVM 文件编码运行时是否会导致哈希冲突(这可能在运行时发生)例如 Windows 和 Linux)。

由于编码是字节序列和字符之间的映射,我认为可能有一些字符串和编码通过了上述测试。但只是想知道是否有任何众所周知的例子或一些充分的理由来说明为什么我不应该依赖于没有发生的哈希冲突。

谢谢

PS:这仅适用于 JDK 1.6 支持的编码,而不适用于某些编造的编码。

最佳答案

是的。举个简单的例子,编码为ISO-8859-1的字符串“¡”(倒置感叹号)和编码为ISO-8859-2的字符串“Ą”(大写A加ogoned)都成为单字节序列A1(十六进制)。当使用将字符映射到单个字节的非常简单的编码时,或多或少会发生这种情况;否则它们不会是不同的编码。当涉及更复杂的编码方案时,它肯定会发生。

关于java - 使用不同编码编码的两个不同字符串是否可以具有相同的字节序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11571632/

相关文章:

php - WordPress MySQL 插入 JSON 编码数据时出现奇怪的行为

c - 在 Swift 3 中读取 TrueType 'cmap' 格式 4 子表

java - .jar 中没有主要 list 属性

encoding - 如何对非 ASCII 字符串和非整数进行 Bencode?

java - Android 应用程序中出现此错误的原因是什么 - channel 已不可恢复地损坏并将被处置

python - 如何在 Python 中将文件转换为 utf-8?

javascript - 使用减号更改 url 中的空格

go - 获取字符集字符串的编码器/解码器

java - 从文件中的字符串中读取java特殊字符

java - 模型是否应该调用服务来获取数据