我在Java中使用以下代码来替换字符,例如:
á é í ó ú Á É Í Ó Ú à è ì ò ù À È Ì Ò Ù
text = text.replace( "á", "a" );
text = text.replace( "é", "e" );
text = text.replace( "Ã", "i" );
text = text.replace( "ó", "o" );
text = text.replace( "ú", "u" );
// caracteres raros: tildes mayusculas
text = text.replace( "Ã", "A" );
text = text.replace( "É", "E" );
text = text.replace( "Ã", "I" );
text = text.replace( "Ó", "O" );
text = text.replace( "Ú", "U" );
// caracteres raros: tildes inversas minusculas
text = text.replace( "Ã ", "a" );
text = text.replace( "è", "e" );
text = text.replace( "ì", "i" );
text = text.replace( "ò", "o" );
text = text.replace( "ù", "u" );
// caracteres raros: tildes inversas mayusculas
text = text.replace( "À", "A" );
text = text.replace( "È", "E" );
text = text.replace( "Ì", "I" );
text = text.replace( "Ã’", "O" );
text = text.replace( "Ù", "U" );
// caracteres raros: ñ minuscula y mayuscula
text = text.replace( "Ñ", "n" );
text = text.replace( "ñ", "N" );
我想使用如下符号:
text = text.replace( "\uD1232", "N" );
但我不知道在哪里可以找到包含这些字符的表格:... À, È, ÃŒ ...
答案 0 :(得分:0)
JDK包含一个名为native2ascii
的工具。
使用特殊字符创建UTF-8编码的文本文件。
例如文件in.txt
:
á é í ó ú Á É Í Ó Ú à è ì ò ù À È Ì Ò Ù
然后致电:
native2ascii -encoding UTF-8 in.txt out.txt
之后,您的文件out.txt
包含类似的转义序列:
\u00e1 \u00e9 \u00ed \u00f3 \u00fa \u00c1 \u00c9 \u00cd \u00d3 \u00da \u00e0 \u00e8 \u00ec \u00f2 \u00f9 \u00c0 \u00c8 \u00cc \u00d2 \u00d9
答案 1 :(得分:0)
部分似乎是最初被错误地解释为ISO-8859-1(Latin-1)等的UTF-8编码文本。
以下是成功修复它的尝试:
public static void main(String[] args) throws IOException {
p1("Ã ", "a");
p1("Ã\u00a0", "a"); // Non-breaking space instead
p1("è", "e");
p1("ì", "i");
p1("ò", "o");
p1("ù", "u");
// caracteres raros: tildes inversas mayusculas
p1("À", "A");
p1("È", "E");
p1("Ì", "I");
p1("Ã’", "O");
p1("Ù", "U");
// caracteres raros: ñ minuscula y mayuscula
p1("Ñ", "n");
p1("ñ", "N");
}
static void p1(String s, String t) {
String v = new String(s.getBytes(StandardCharsets.ISO_8859_1),
StandardCharsets.UTF_8);
String u = Normalizer.normalize(v, Normalizer.Form.NFD)
.replaceAll("\\pM", "");
if (u.equalsIgnoreCase(t)) {
System.out.printf("[1] %s -> %s :: %s%n", v, u, t);
} else {
p2(s, t);
}
}
static void p2(String s, String t) {
String v = new String(s.getBytes(Charset.forName("Windows-1252")),
StandardCharsets.UTF_8);
String u = Normalizer.normalize(v, Normalizer.Form.NFD)
.replaceAll("\\pM", "");
System.out.printf("[2] %s -> %s :: %s%n", v, u, t);
}
[2] � -> � -> a
[1] à -> a :: a
[1] è -> e :: e
[1] ì -> i :: i
[1] ò -> o :: o
[1] ù -> u :: u
[2] À -> A -> A
[2] È -> E -> E
[2] Ì -> I -> I
[2] Ò -> O -> O
[2] Ù -> U -> U
[2] Ñ -> N -> n
[1] ñ -> n :: N
正如你所看到的那样,n / N显然已经混淆了。并且第一个带有空间的条目显然已损坏。 s = s.replace(' ', '\u00a0');
会这样做。
上面的代码使用Normalizer来丢弃重音,通过在基本字母中分割重音字母并组合变音符号。通过replaceAll删除后者。
(上面的代码最好在使用UTF-8编码的java源代码中编辑和编译,不会有任何意外。)