【问题标题】:How to normalize Unicode digits in Java如何在 Java 中规范化 Unicode 数字
【发布时间】:2014-10-28 17:55:18
【问题描述】:

是否有任何 Java API 可以将 Unicode 数字标准化为 ASCII 数字?

JDKICU4J 中有一个规范化 API,它似乎无法处理这种规范化(因为它可能不被 Unicode standard 称为规范化)

我需要将所有形式的 Unicode 数字 (listed in this post) 转换为 [0-9]。一个可能的混乱解决方案是 10 替换所有从 0 到 9 的数字。

【问题讨论】:

    标签: java unicode normalization digit unicode-normalization


    【解决方案1】:

    更新

    这可以使用ICU4J Transliteration API。 以下音译器从字符串中删除除 a-z、A-Z、0-9 和破折号(减号)之外的任何非 ASCII 字符。

    Transliterator trans = Transliterator.getInstance("Any-Latin; NFD; [^a-zA-Z0-9-] Remove");
    System.out.println(trans.transform("۱۲۳456"));
    

    将打印:

    123456
    

    另一个混乱的解决方案

    static final Pattern DIGIT_0 = Pattern.compile("[٠۰߀०০੦૦୦௦౦೦൦๐໐0]");
    static final Pattern DIGIT_1 = Pattern.compile("[١۱߁१১੧૧୧௧౧೧൧๑໑1]");
    static final Pattern DIGIT_2 = Pattern.compile("[٢۲߂२২੨૨୨௨౨೨൨๒໒2]");
    static final Pattern DIGIT_3 = Pattern.compile("[٣۳߃३৩੩૩୩௩౩೩൩๓໓3]");
    static final Pattern DIGIT_4 = Pattern.compile("[٤۴߄४৪੪૪୪௪౪೪൪๔໔4]");
    static final Pattern DIGIT_5 = Pattern.compile("[٥۵߅५৫੫૫୫௫౫೫൫๕໕5]");
    static final Pattern DIGIT_6 = Pattern.compile("[٦۶߆६৬੬૬୬௬౬೬൬๖໖6]");
    static final Pattern DIGIT_7 = Pattern.compile("[٧۷߇७৭੭૭୭௭౭೭൭๗໗7]");
    static final Pattern DIGIT_8 = Pattern.compile("[٨۸߈८৮੮૮୮௮౮೮൮๘໘8]");
    static final Pattern DIGIT_9 = Pattern.compile("[٩۹߉९৯੯૯୯௯౯೯൯๙໙9��]");
    
    public static final Pattern[] DIGIT_PATTERN_LIST = { DIGIT_0, DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4, DIGIT_5, DIGIT_6, DIGIT_7, DIGIT_8,
            DIGIT_9 };
    
    /**
     * Converts any Unicode digits into their ASCII equivalent. For example given 23۹٤۴ returns 23944
     * 
     * @param str
     * @return
     */
    public static String normalizeUnicodeDigits(String str) {
        for (int i = 0; i < DIGIT_PATTERN_LIST.length; i++) {
            Pattern dp = DIGIT_PATTERN_LIST[i];
            str = dp.matcher(str).replaceAll(String.valueOf(i));
        }
        return str;
    }
    

    【讨论】:

      【解决方案2】:

      您正在尝试做的事情称为transliteration

      【讨论】:

        【解决方案3】:

        Character.forDigit(...)Character.digit(...) 的组合应该可以工作。

        public static char normalizeDigit(char c) {
          int d = Character.digit(c, 10);
          return (d >= 0) ? Character.forDigit(d, 10): c;
        }
        

        遍历所有字符。

        【讨论】:

          猜你喜欢
          • 2013-05-04
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          • 2015-11-01
          • 2011-12-08
          相关资源
          最近更新 更多