可能重复:
符号转换,雅绅特来函英文字母
我需要替换所有重音字符,如
"à", "é", "ì", "ò", "ù"
同
"a'", "e'", "i'", "o'", "u'"...
因为他们已经保存重装后用重音字符的字符串嵌套一个问题。
有没有办法做到这一点,而无需使用不同的字符串替换所有字符?
举例来说,我宁愿避免做
text = text.replace("a", "a'");
text2 = text.replace("è", "e'");
text3 = text2.replace("ì", "i'");
text4 = text3.replace("ò", "o'");
text5 = text4.replace("ù", "u'");
等等
我想这个从这个职位似乎工作。
String str= Normalizer.normalize(str, Normalizer.Form.NFD);
str= str.replaceAll("\\p{InCombiningDiacriticalMarks}+", "'");
编辑:但用组合变音标记,有副作用,就是不能A A A区分
如果你不介意加入公地郎作为依赖,尝试StringUtils.replaceEach我相信下面的执行同样的任务:
import org.apache.commons.lang.StringUtils;
public class ReplaceEachTest
{
public static void main(String [] args)
{
String text = "àéìòùàéìòù";
String [] searchList = {"à", "é", "ì", "ò", "ù"};
String [] replaceList = {"a'", "e'", "i'", "o'", "u'"};
String newtext = StringUtils.replaceEach(text, searchList, replaceList);
System.out.println(newtext);
}
}
这个例子打印a'e'i'o'u'a'e'i'o'u'
不过总的来说,我同意,因为你正在创建一个自定义的字符转换,你需要一个解决方案,您明确指定替代感兴趣的每个字符。
我以前使用replaceChars答案是否定的好,因为它只能处理一到一个字符替换。
在主要做法阅读评论后,我想一个更好的选择将解决这个问题 - 这是编码相关? - 而不是试图掩盖症状。
此外,这还需要手动显式的映射,这可能使它比nandeesh的使用正则表达式的Unicode字符类的回答不太理想的。
下面是代码来执行所述映射的骨架。 它是略高于一炭炭更加复杂。
此代码试图避免额外的字符串。 它可能是或不是“更有效率”。 与真实数据/使用试试吧。 因人而异。
String mapAccentChar (char ch) {
switch (ch) {
case 'à': return "a'";
// etc
}
return null;
}
String mapAccents (String input) {
StringBuilder sb = new StringBuilder();
int l = input.length();
for (int i = 0; i < l; i++) {
char ch = input.charAt(i);
String mapped = mapAccentChar(ch);
if (mapped != null) {
sb.append(mapped);
} else {
sb.append(ch);
}
return sb.toString();
}
既然有一个字符的ASCII值及其重音的版本之间没有严格的相关性,您的更换在我看来,最直接的方法。