3

私は次の形式の文字列を持っています:

"aaa \\ u2022bbb \\ u2014ccc"

2つの特別な文字を表示したいのですが、それを可能にするには、最初に文字列を次の形式に変換する必要があります。

"aaa \ u2022bbb \ u2014ccc"

これを書いてみましたが、コンパイルエラーが発生します。

String encodedInput = input.replace("\\u", "\u");

これは簡単なことですが、私にはわかりません。何か案は?

4

5 に答える 5

4

残念ながら、私はある種の評価を知りません。

    String s = "aaa\\u2022bbb\\u2014ccc";
    StringBuffer buf = new StringBuffer();
    Matcher m = Pattern.compile("\\\\u([0-9A-Fa-f]{4})").matcher(s);
    while (m.find()) {
        try {
            int cp = Integer.parseInt(m.group(1), 16);
            m.appendReplacement(buf, "");
            buf.appendCodePoint(cp);
        } catch (NumberFormatException e) {
        }
    }
    m.appendTail(buf);
    s = buf.toString();
于 2012-04-05T21:23:02.173 に答える
3

他の人(barsjuなど)が指摘しているように、エスケープをエスケープすることに加えて、\uNNNN表記の実際のUnicode文字への通常の変換はコンパイル時にJavaコンパイラによって行われることも考慮する必要があります。

したがって、バックスラッシュのエスケープの問題を解決した後でも、コンパイル時ではなく実行時に文字列を操作しているように見えるため、実際のUnicode文字を表示するのにさらに問題が発生する可能性があります。

この回答\uNNNNは、実行時文字列のエスケープシーケンスを実際の対応するUnicode文字に置き換える方法を提供します。このメソッドには、エラー処理、境界チェック、および予期しない入力に関して、いくつかのTODOが残っていることに注意してください。

(編集:ここで提供されている正規表現ベースのソリューションは、予期しない入力データの処理に関してより洗練されているため、リンクした方法よりも優れていると思います)。

于 2012-04-05T21:03:45.277 に答える
2

試す

Pattern unicode = Pattern.compile("\\\\u(.{4})");
Matcher matcher = unicode.matcher("aaa\\u2022bbb\\u2014ccc");
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    int code = Integer.parseInt(matcher.group(1), 16);
    matcher.appendReplacement(sb, new String(Character.toChars(code)));
}
matcher.appendTail(sb);
System.out.println(sb.toString());
于 2012-04-05T20:58:36.060 に答える
0

あなたはあなたの脱出を逃れる必要があります:

System.out.println("aaa\\u2022bbb\\u2014ccc".replace("\\\\u", "\\u"));
于 2012-04-05T21:00:06.163 に答える
0
String input = "aaa\\u2022bbb\\u2014ccc";
String korv = input.replace("\\\\u", "\\u");
System.out.println(korv);

=>

aaa\u2022bbb\u2014ccc

これは、「\」が文字列内の特殊文字であるため、引用符で囲む必要があるためです。"\"=="\"。

于 2012-04-05T21:00:19.020 に答える