我希望规范化任何扩展的ASCII字符,但排除掉变音符。
如果我想包括变音符,我会选择:
Normalizer.normalize(value, Normalizer.Form.NFKD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
但是我如何排除德语umlauts?
结果我想要得到:
源代码: üöäâÇæôøñÁ
期望结果: üöäaCaeoonA
或类似结果
我希望规范化任何扩展的ASCII字符,但排除掉变音符。
如果我想包括变音符,我会选择:
Normalizer.normalize(value, Normalizer.Form.NFKD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
但是我如何排除德语umlauts?
结果我想要得到:
源代码: üöäâÇæôøñÁ
期望结果: üöäaCaeoonA
或类似结果
// Latin to ASCII - mostly
private static final String TAB_00C0 = "" +
"AAAAÄAACEEEEIIII" +
"DNOOOOÖ×OUUUÜYTß" +
"aaaaäaaceeeeiiii" +
"dnooooö÷ouuuüyty" +
"AaAaAaCcCcCcCcDd" +
"DdEeEeEeEeEeGgGg" +
"GgGgHhHhIiIiIiIi" +
"IiJjJjKkkLlLlLlL" +
"lLlNnNnNnnNnOoOo" +
"OoOoRrRrRrSsSsSs" +
"SsTtTtTtUuUuUuUu" +
"UuUuWwYyYZzZzZzs";
private static HashMap<Character, String> LIGATURES = new HashMap<>(){{
put('æ', "ae");
put('œ', "oe");
put('þ', "th");
put("ij", "ij");
put('ð', "dh");
put("Æ", "AE");
put("Œ", "OE");
put("Þ", "TH");
put("Ð", "DH");
put("IJ", "IJ");
//TODO
}};
public static String removeAllButUmlauts(String value) {
value = Normalizer.normalize(value, Normalizer.Form.NFC);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < source.length(); i++) {
char c = source.charAt(i);
String l = LIGATURES.get(c);
if (l != null){
sb.append(l);
} else if (c < 0xc0) {
sb.append(c); // ASCII and C1 control codes
} else if (c >= 0xc0 && c <= 0x17f) {
c = TAB_00C0.charAt(c - 0xc0); // common single latin letters
sb.append(c);
} else {
// anything else, including Vietnamese and rare diacritics
l = Normalizer.normalize(Character.toString(c), Normalizer.Form.NFKD)
.replaceAll("[\\p{InCombiningDiacriticalMarks}]+", "");
sb.append(l);
}
}
return sb.toString();
}
然后
String value = "üöäâÇæôøñÁ";
String after = removeAllButUmlauts(value);
System.out.println(after)
üöäaCaeoonA
removeAllButGermanUmlauts
。虽然很难看出它是否实现了这个功能,但这正是问题所要求的。德语umlauts是“üöä”(大写和小写)。 - Tom Blodget从这里我看到两个解决方案,第一个相当麻烦,第二个实现起来相当无聊。
从你想要规范化的字符串中删除带有变音符号的字符,然后在规范化后将它们放回去。
不要使用预先构建的模式 p{InCombiningDiacriticalMarks}
。而是构建自己的模式,排除变音符号。
请查看:
â -> a
例如,这就是规范化程序所做的。 - membersound