字符串视觉内容一致但比较返回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
相关产品推荐
相关产品推荐

