gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:48 28 4
gpt4 key购买 nike

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

它不会等于"bãi"

我也试试

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

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

谁知道怎么解决这个问题。感谢您的帮助。

最佳答案

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

  1. 单个代码点 U+00E3(带波浪号的拉丁文小写字母 A)
  2. 两个代码点 U+0061(拉丁文小写字母 A)和 U+0303(组合代字号)

为了显示,两者应该看起来一样。

对于字符串比较,这会带来一个问题。解决方案是先根据 Unicode Standard Annex #15 — Unicode Normalization Forms 规范化字符串。 .

规范化在 Java(包括 Android)中由 Normalizer class 支持(对于 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

顺便说一句:Form.NFD 形式分解了字符串,即它用两个代码点创建了更长的表示形式。 Form.NFC 将创建较短的表单。

关于Android比较UTF-8字符串与UTF-8输入字符串的edittext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41438367/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com