Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中删除字符串中的尖锐重音?_Java_String_Kotlin_Diacritics - Fatal编程技术网

如何在java中删除字符串中的尖锐重音?

如何在java中删除字符串中的尖锐重音?,java,string,kotlin,diacritics,Java,String,Kotlin,Diacritics,我知道这件事 public static String stripAccents(String s) { s = Normalizer.normalize(s, Normalizer.Form.NFD); s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""); return s; } 但它不是我想要的方式。它改变了文本的意义 stripAccents("йо

我知道这件事

public static String stripAccents(String s) {
    s = Normalizer.normalize(s, Normalizer.Form.NFD);
    s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
    return s;
}
但它不是我想要的方式。它改变了文本的意义

stripAccents("йод,ëлка,wäre") //иод,елка,ware
我只想删除尖锐的口音

stripAccents("café") //cafe

似乎最好是将带有尖锐重音的特定重音字符集重新映射为普通字母:

公共静态字符串条带重音符号(字符串s){
if(null==s | | s.isEmpty()){
返回s;
}
最终字符串[]映射={
"ÁÉÍÓÚÝáéíóúý",
“再见再见”
};
返回s.chars()
.mapToObj(c->(char)(映射[0].indexOf(c)>-1?映射[1].charAt(映射[0].indexOf(c)):c))
收集(
StringBuilder::新建,StringBuilder::追加,
StringBuilder::append,StringBuilder::toString
));
}
//或者在JDK 12中使用更新的switch语句
公共静态字符串stripAcuteAccents(字符串s){
if(null==s | | s.isEmpty()){
返回s;
}
char[]raw=s.toCharArray();
for(int i=0;i“A”;案例“Á”->“E”;案例“Í”->“I”;
案例“Ó”->“O”;案例“Ú”->“U”;案例“Ý”->“Y”;
案例a->a;案例e->e;案例i->i;
案例“ó”->“o”;案例“ú”->“u”;案例“ý”->“y”;
默认->原始[i];
};
}
返回新字符串(原始);
}
基本测试:

String[]测试={“café”、“ÁToi”、“ÁÍÚÝÝýý-bcdef”};
Arrays.stream(测试)
.forEach(s->System.out.printf(“%s->%s%n”,s,带重音符号);
输出

café -> cafe
Á Toi -> A Toi
ÁÉÍÓÚÝáéíóúý - bcdef -> AEIOUYaeiouy - bcdef

似乎最好是将带有尖锐重音的特定重音字符集重新映射为普通字母:

公共静态字符串条带重音符号(字符串s){
if(null==s | | s.isEmpty()){
返回s;
}
最终字符串[]映射={
"ÁÉÍÓÚÝáéíóúý",
“再见再见”
};
返回s.chars()
.mapToObj(c->(char)(映射[0].indexOf(c)>-1?映射[1].charAt(映射[0].indexOf(c)):c))
收集(
StringBuilder::新建,StringBuilder::追加,
StringBuilder::append,StringBuilder::toString
));
}
//或者在JDK 12中使用更新的switch语句
公共静态字符串stripAcuteAccents(字符串s){
if(null==s | | s.isEmpty()){
返回s;
}
char[]raw=s.toCharArray();
for(int i=0;i“A”;案例“Á”->“E”;案例“Í”->“I”;
案例“Ó”->“O”;案例“Ú”->“U”;案例“Ý”->“Y”;
案例a->a;案例e->e;案例i->i;
案例“ó”->“o”;案例“ú”->“u”;案例“ý”->“y”;
默认->原始[i];
};
}
返回新字符串(原始);
}
基本测试:

String[]测试={“café”、“ÁToi”、“ÁÍÚÝÝýý-bcdef”};
Arrays.stream(测试)
.forEach(s->System.out.printf(“%s->%s%n”,s,带重音符号);
输出

café -> cafe
Á Toi -> A Toi
ÁÉÍÓÚÝáéíóúý - bcdef -> AEIOUYaeiouy - bcdef

仅针对尖锐的口音:

s = Normalizer.normalize(s, Normalizer.Form.NFD); // Decompose
s = s.replace("\u0301", ""); // Combining acute accent (´)
s = Normalizer.normalize(s, Normalizer.Form.NFC); // Compose again
作曲是最短的,通常用字体表现得更好

即使没有正则表达式,这也会删除零长度的锐重音


对于带有浓重口音的意大利咖啡馆,使用
\u0300

仅用于尖锐口音:

s = Normalizer.normalize(s, Normalizer.Form.NFD); // Decompose
s = s.replace("\u0301", ""); // Combining acute accent (´)
s = Normalizer.normalize(s, Normalizer.Form.NFC); // Compose again
作曲是最短的,通常用字体表现得更好

即使没有正则表达式,这也会删除零长度的锐重音

对于意大利咖啡馆,请使用
\u0300