Android将UTF-8字符串与UTF-8输入字符串edittext进行比较

时间:2017-01-03 07:22:21

标签: android utf-8

在我的Android应用程序中,我想比较一个utf-8字符串,例如“bãi”与用户在edittext上输入的字符串。
但是,如果我输入“bãi”来编辑文本并使用方法edittext.getText()。toString()获取输入字符串,它将返回类似input string的字符串

并且它不等于“bãi”

我也试试

String input = new String(input.getBytes("UTF-8"), "UTF-8");

但它不起作用。 input.equals(“bãi”)将返回false。

有谁知道如何解决这个问题。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

在Unicode中,某些字符可以多种方式表示。例如,在单词bãi中,中间字符可以用两种方式表示:

  1. 单个代码点U + 00E3(LATIN SMALL LETTER A with TILDE)
  2. 两个代码点U + 0061(LATIN SMALL LETTER A)和U + 0303(COMBINING TILDE)
  3. 显示时,两者看起来都一样。

    对于字符串比较,这会产生问题。解决方案是首先根据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会创建更短的表单。