java - 比较两个在字典顺序上相同但在字节级别不相同的字符串

标签 java string utf-8

我正在寻找一种方法来比较两个 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/

相关文章:

java - String的子串函数与StringBuffer的子串函数

objective-c - Objective-C 中字符串到 UTF8 字符的转换

linux - 使用 X11 显示获取 UTF-8 输入

java - Quartz 预定作业未触发 - 可能未处理的异常?

java - 检测是否使用 mockito 调用了 private static final 字段的方法

algorithm - 在大量字符串中查找相似字符串组

c++ - 在字符串中的一行中搜索大于 0 的数字

sql - h2 org.h2.jdbc.JdbcSQLSyntaxErrorException 在h2数据库中执行脚本文件时出现

java - 如何在 spring boot 中从属性文件为 @Order 注释设置值

java - 使用 DateFormat 将字符串转换为日期