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

Android将UTF-8字符串与edittext的UTF-8输入字符串进行比较,android,utf-8,Android,Utf 8,在我的android应用程序中,我想比较utf-8字符串,例如“bãi”与用户在edittext上键入的字符串。 但是,如果我在edittext中键入“bãI”,并使用方法edittext.getText().toString()获取输入字符串,它将返回类似于 它将不等于“bãi” 我也尝试 String input = new String(input.getBytes("UTF-8"), "UTF-8"); 但它不起作用。input.equals(“bãi”)将返回false 有人知道如何

在我的android应用程序中,我想比较utf-8字符串,例如“bãi”与用户在edittext上键入的字符串。
但是,如果我在edittext中键入“bãI”,并使用方法edittext.getText().toString()获取输入字符串,它将返回类似于

它将不等于“bãi”

我也尝试

String input = new String(input.getBytes("UTF-8"), "UTF-8");
但它不起作用。input.equals(“bãi”)将返回false

有人知道如何解决这个问题吗。
感谢您的帮助。

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

  • 单个代码点U+00E3(带波浪号的拉丁文小写字母a)
  • 两个代码点U+0061(拉丁文小写字母A)和U+0303(组合波浪线)
  • 对于显示,两者的外观应该相同

    对于字符串比较,这会带来一个问题。解决方案是首先根据规范化字符串

    Java(包括Android)支持标准化(对于Android,请参阅)

    下面的代码显示了结果:

    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)));
    
    它输出:

    标准化之前的
    :bãi==bãi=>false
    规范化后:bãi==bãi=>true
    

    顺便说一句:表单
    form.NFD
    分解字符串,也就是说,它用两个代码点创建更长的表示<代码>表单。NFC将创建较短的表单。

    这个问题不是重复的。它以“ã”的表示为中心,在第一种情况下,它可能作为单个Unicode码点(U+00E3)给出,在第二种情况下,它可能作为两个独立的码点(U+0061和U+0303)给出。在比较它们之前,先规范化字符串。这将消除与组合字符相关的差异。请看。@IntelliJAmiya:请重新开始这个问题。当你们仔细阅读的时候,你们会发现这不是一个副本。我已经添加了一个正确的答案。谢谢Codo提供了详细的答案。它解决了我的问题。