我正在寻找一种方法来比较两个 Java 字符串,这两个字符串在字典顺序上是等效的,但在字节级别上不相同。
更准确地说,取下面的文件名“baaaé.png”,在字节级别,它可以用两种不同的方式表示:
[98, 97, 97, 97, -61, -87, 46, 112, 110, 103] --> "é"用 2 个字节编码
[98, 97, 97, 97, 101, -52, -127, 46, 112, 110, 103] --> "é"用 3 个字节编码
byte[] ch = {98, 97, 97, 97, -61, -87, 46, 112, 110, 103};
byte[] ff = {98, 97, 97, 97, 101, -52, -127, 46, 112, 110, 103};
String st = new String(ch,"UTF-8");
String st2 = new String(ff,"UTF-8");
System.out.println(st);
System.out.println(st2);
System.out.println(st.equals(st2));
将生成以下输出:
baaaé.png
baaaé.png
false
有没有办法进行比较,使 equals 方法返回 true ?
最佳答案
您可以使用 Collator具有适用强度的类可以规范化不同重音符号等内容。这将使您能够成功地比较字符串。
在这种情况下,美国语言环境和 TERTIARY 强度足以使字符串相等
Collator usCollator = Collator.getInstance();
usCollator.setStrength(Collator.TERTIARY);
System.out.println(usCollator.equals(st, st2));
输出
true
您还可以使用 Java 的 Normalizer类在不同形式的 Unicode 之间进行转换。这将转换您的字符串,但它们最终会相同,从而允许您使用标准字符串工具进行比较
最后,不妨看看ICU (Unicode 的国际组件)项目,它提供了许多工具,用于以多种不同方式处理 Unicode 字符串。
关于java - 比较两个在字典顺序上相同但在字节级别不相同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14487845/