如何在Java中规范化Unicode数字

时间:2014-09-04 05:16:44

标签: java unicode normalization digit unicode-normalization

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

JDKICU4J中的规范化API似乎无法处理这种规范化(因为它可能不会被Unicode standard称为规范化)< / p>

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

3 个答案:

答案 0 :(得分:1)

<强>更新

使用ICU4J Transliteration API可以做到这一点。 以下音译器从字符串中删除任何非ASCII字符,但a-z,A-Z,0-9和短划线(减号)除外。

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;
}

答案 1 :(得分:1)

结合使用Character.forDigit(...)Character.digit(...)

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

遍历所有字符。

答案 2 :(得分:0)

您要做的事情称为transliteration