【问题标题】:Android toLowerCase() issue with accented characters带有重音字符的Android toLowerCase()问题
【发布时间】:2021-07-07 22:54:38
【问题描述】:

我的应用具有根据某些关键字过滤内容的功能。 这是不区分大小写的,所以为了工作,我首先在源内容上调用 String.toLowerCase()

我遇到的问题是源是大写的并且包含重音字符,例如法语单词:“INVITÉ”

当使用设备默认区域设置为lowercase 时,此词返回“invité” 问题是最后一个字符和小写字符“é”不一样 相反,它是 2 个字符的组合: "e" 101 & “'”769

因为这个“邀请”与“邀请”不匹配

我该如何解决这个问题?我不希望完全删除重音字符

【问题讨论】:

    标签: java android non-ascii-characters lowercase


    【解决方案1】:

    你应该像这样规范化字符串。

    String upper = "INVITÉ";
    System.out.println(upper + " length=" + upper.length());
    String lower = upper.toLowerCase();
    System.out.println(lower + " length=" + lower.length());
    String normalized = Normalizer.normalize(lower, Normalizer.Form.NFC);
    System.out.println(normalized + " length=" + normalized.length());
    

    输出:

    INVITÉ length=7
    invité length=7
    invité length=6
    

    它也适用于日语。

    String japanese = "が";
    System.out.println(japanese + " length=" + japanese.length());
    String normalized = Normalizer.normalize(japanese, Normalizer.Form.NFC);
    System.out.println(normalized + " length=" + normalized.length());
    

    输出:

    が length=2
    が length=1
    

    【讨论】:

    • 这是否适用于所有现有语言,包括日语、中文……?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多