【问题标题】:How to normalize Unicode digits in Java如何在 Java 中规范化 Unicode 数字
【发布时间】:2014-10-28 17:55:18
【问题描述】:
【问题讨论】:
标签:
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;
}
【解决方案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;
}
遍历所有字符。