如何将编码字符替换为字符串文字?喜欢\ uDXYZW或类似的东西?

时间:2017-05-16 21:34:20

标签: java string text unicode utf-8

我在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" );

但我不知道在哪里可以找到包含这些字符的表格:... À, È, ÃŒ ...

2 个答案:

答案 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是Unicode字符集
  • ISO-8859-1是Latin-1,UTF-8的子集
  • Windows-1252是Windows Latin-1,是Latin-1的“超集”。

(上面的代码最好在使用UTF-8编码的java源代码中编辑和编译,不会有任何意外。)