我正在研究一种算法,它可以在带有变音符号(波浪符号、扬抑符号、插入符号、乌姆劳特符号、卡隆符号)的字符和它们的“简单”字符之间进行映射
例如:
ǹňñṅ ņ ṇ ṋ ṉ ̈ ɲ ƞ ᶇ ɳȵ-->;N
á-->;A.
ä-->;A.
ấ --&燃气轮机;A.
ṏ --&燃气轮机;o
等等
-
我想在Java中实现这一点,尽管我怀疑它应该是Unicode-y的,并且在任何语言中都应该可以相当容易地实现
-
目的:允许轻松搜索带有变音符号的单词。例如,如果我有一个网球运动员的数据库,并且输入了比约恩·博格,我也会保留比约恩·博格,这样如果有人输入比约恩而不是比约恩,我就可以找到它
我最近在Java中完成了这项工作:
公共静态最终模式变音符号和朋友
=Pattern.compile(“[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+”;
私有静态字符串stripDiacritics(字符串str){
str=Normalizer.normalize(str,Normalizer.Form.NFD);
str=DIACRITICS\u和\u FRIENDS.matcher(str).replaceAll(“”);
返回str;
}
这将按照您指定的方式执行:
stripediacritics(“Björn”)=Bjorn
但它会在例如Białystok上失败,因为ł字符不是变音字符
如果你想拥有一个完整的字符串简化程序,你需要第二轮清理,对于一些非变音符号的特殊字符。在这张地图上,我列出了出现在客户姓名中的最常见的特殊字符。这不是一个完整的列表,但它会告诉你如何扩展它。immutableMap只是google collections中的一个简单类
公共类字符串简化器{
公共静态最终字符默认值_REPLACE_char='-';
公共静态最终字符串DEFAULT\u REPLACE=String.valueOf(DEFAULT\u REPLACE\u CHAR);
私有静态最终ImmutableMap<;String,String>;NONDIACRITICS=ImmutableMap<;String,String>;builder()
//删除没有语义的垃圾字符串
.put(“.”,“”)
.put(“\”,“”)
.put(“,”)
//将相关字符分开保存
.put(“,默认值\u替换)
.put(“]”,默认值(替换)
.put(“[”,默认值_替换)
.put(“)”,默认值(替换)
.put(“(”,默认值_替换)
.put(“=”,默认值\u替换)
.put(“!”,默认值(替换)
.put(“/”,默认值\u替换)
.put(“\\”,默认值\u替换)
.put(“&;”,默认值\u替换)
.put(“,”,默认值\u替换)
.put(“?”,默认值(替换)
.put(“”),默认值\u REPLACE)//Remove??是变音符号吗?
.put(“|”,默认值_替换)
.put(“<;”,默认值\u替换)
.put(“>;”,默认值\u替换)
.put(“;”,默认值(替换)
.put(“:”,默认值\u替换)
.put(“\u”,默认值\u替换)
.put(“#”,默认值_替换)
.put(“~”,默认值\u替换)
.put(“+”,默认值_替换)
.put(“*”,默认值\u替换)
//将非变音符号替换为它们的等效字符
.put(“\u0141”,“l”)//BiaLystock
.put(“\u0142”,“l”)//Bialystock
.put(“ß”、“ss”)
.put(“æ”、“ae”)
.put(“ø”,“o”)
.put(“)”、“c”)
.put(“\u00D0”,“d”)//从http://de.wikipedia.org/wiki/%C3%90
.put(“\u00F0”,“d”)
.put(“\u0110”,“d”)
.put(“\u0111”,“d”)
.put(“\u0189”,“d”)
.put(“\u0256”,“d”)
.put(“\u00DE”,“th”)//thornÞ
.put(“\u00FE”,“th”)//thornþ
.build();
公共静态字符串simplifiedString(字符串源){
字符串str=orig;
如果(str==null){
返回null;
}
str=条带临界值(str);
str=非二次临界(str);
如果(str.length()==0){
//处理不存在的空字符串的特殊情况
//在Oracle中。将原始字符串存储为简化字符串。
//如果Oracle可以存储它,它将返回一个空字符串。
返回原点;
}
return str.toLowerCase();
}
私有静态字符串stripNonDiacritics(字符串源){
StringBuffer ret=新的StringBuffer();
字符串lastchar=null;
对于(int i=0;i<;orig.length();i++){
字符串源=原始子字符串(i,i+1);
String replace=NONDIACRITICS.get(源);
String toReplace=replace==null?String.valueOf(源):replace;
if(默认替换等于(lastchar)和默认替换等于(toReplace)){
toReplace=“”;
}否则{
lastchar=toReplace;
}
ret.append(toReplace);
}
if(ret.length()>;0&;DEFAULT_REPLACE_CHAR==ret.charAt(ret.length()-1)){
ret.deleteCharAt(ret.length()-1);
}
返回ret.toString();
}
/*
与简化相关的特殊正则表达式字符范围->;请参阅http://docstore.mik.ua/orelly/perl/prog3/ch05_04.htm
组合符号:作为“正常”ä、ö、î等的一部分的特殊符号。。
IsSk:符号,修饰符请参见http://www.fileformat.info/info/unicode/category/Sk/list.htm
IsLm:字母,修饰符请参见http://www.fileformat.info/info/unicode/category/Lm/list.htm
*/
公共静态句型变音符号和朋友
=Pattern.compile(“[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+”;
私有静态字符串stripDiacritics(字符串str){
str=Normalizer.normalize(str,Normalizer.Form.NFD);
str=DIACRITICS\u和\u FRIENDS.matcher(str).replaceAll(“”);
返回str;
}
}