在我的Android应用程序中,我想比较一个utf-8字符串,例如“bãi”与用户在edittext上输入的字符串。
但是,如果我输入“bãi”来编辑文本并使用方法edittext.getText()。toString()获取输入字符串,它将返回类似的字符串
并且它不等于“bãi”
我也试试
String input = new String(input.getBytes("UTF-8"), "UTF-8");
但它不起作用。 input.equals(“bãi”)将返回false。
有谁知道如何解决这个问题。 谢谢你的帮助。
答案 0 :(得分:3)
在Unicode中,某些字符可以多种方式表示。例如,在单词bãi中,中间字符可以用两种方式表示:
显示时,两者看起来都一样。
对于字符串比较,这会产生问题。解决方案是首先根据Unicode Standard Annex #15 — Unicode Normalization Forms规范化字符串。
Normalizer class在Java(包括Android)中支持规范化(对于Android,请参阅Normalizer)。
下面的代码显示了结果:
String s1 = "b\u00e3i";
String s2 = "ba\u0303i";
System.out.println(String.format("Before normalization: %s == %s => %b", s1, s2, s1.equals(s2)));
String n1 = Normalizer.normalize(s1, Form.NFD);
String n2 = Normalizer.normalize(s2, Form.NFD);
System.out.println(String.format("After normalization: %s == %s => %b", n1, n2, n1.equals(n2)));
输出:
Before normalization: bãi == bãi => false
After normalization: bãi == bãi => true
BTW:格式Form.NFD
分解字符串,即它使用两个代码点创建更长的表示。 Form.NFC
会创建更短的表单。