You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串视觉内容一致但比较返回false,求排查代码问题

字符串视觉相同但比较返回false的问题

我需要将识别出的字符串中的每个单词与基准字符串比较,Logcat里看起来两个字符串一样,但比较返回false。试过a.contains(b)和a.compare(b)==0,结果还是false。

代码示例

String check = "HĐ:";
for(String word : textInLine.split(" ")){
    log("CHECK_WORD_TEXT ${word} AND ${check}");
    log("CHECK_WORD_COMPARE ${word == check}");
}

Logcat输出

[log] CHECK_WORD_TEXT HÐ: AND HĐ:
[log] CHECK_WORD_COMPARE false

问题原因

你看到的两个字符视觉相似但属于不同的Unicode编码:

  • 基准字符串里的是越南语字母 Đ(Unicode码点U+0110)
  • 识别出的字符串里的是拉丁字母 Ð(Unicode码点U+00D0)
    这两个字符外观接近,但本质是完全不同的字符,所以直接比较会返回false。另外你代码里用==比较字符串本身也有问题,Java中==比较的是对象引用,不是字符串内容。

解决方法

  • 确认字符真实编码
    可以在代码里打印每个字符的Unicode码点,验证差异:

    // 打印基准字符的码点
    log("Check char code: " + (int) check.charAt(1));
    // 打印识别出的字符的码点
    log("Word char code: " + (int) word.charAt(1));
    

    输出会分别显示272(U+0110)和208(U+00D0),明确差异来源。

  • 统一字符后再比较
    针对这个场景,直接将识别出的Ð替换为Đ后再比较最高效:

    String normalizedWord = word.replace('Ð', 'Đ');
    log("CHECK_WORD_COMPARE ${normalizedWord.equals(check)}");
    

    如果后续遇到更多视觉混淆的字符,可以使用java.text.Normalizer进行Unicode规范化处理。

  • 使用正确的字符串比较方法
    Java中比较字符串内容必须用equals()方法,==仅用于判断两个字符串是否为同一个对象。即使字符完全一致,不同的String对象用==也会返回false,正确写法是word.equals(check)。

内容的提问来源于stack exchange,提问作者Sơn Vi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:36:22