2

中引用符が含まれている文字列があります。他のダウンストリームシステムを混乱させないように、これらをHTMLエンティティに置き換えたいと思います。最初の試みでは、置き換えたい文字に一致するものを追加し、コードに直接入力しました。

public static String escapeXml(String s) {
    StringBuilder sb = new StringBuilder();
    char characters[] = s.toCharArray();
    for ( int i = 0; i < characters.length; i++ ) {
        char c = characters[i];
        switch (c) {
            // other escape characters deleted for clarity
            case '“':
                sb.append("&#8220;");
                break;
            case '”':
                sb.append("&#8221;");
                break;
            case '‘':
                sb.append("&#8216;");
                break;
            case '’':
                sb.append("&#8217;");
                break;
            default:
                sb.append(c);
                break;
        }
    }
    return sb.toString();
}

これは私のMacでコンパイルして正常に動作しましたが、CIサーバー(Linuxで実行)がビルドしようとすると、次のように機能しなくなりました。

Out.java:[347,16] duplicate case label

どうやら、Linuxボックスのビルドチェーンの一部は、これらの派手な文字を認識して区別することができません。

私の次の試みは、Unicodeエスケープを使用することでした。残念ながら、これは私のMacでもコンパイルできません。

...
            case '\u8220':
                sb.append("&#8220;");
                break;
            case '/u8221':
                sb.append("&#8221;");
                break;
...

私のコンパイラはこの苦情を投げます:

Out.java:[346,21] unclosed character literal

このビットの置換をどのように実行し、プラットフォーム間で確実に機能させることができるかについて、私は困惑しています。誰かがポインタを持っていますか?前もって感謝します。

4

5 に答える 5

4

Unicodeリテラルは16進数です。

case '\u201c':
    sb.append("&#8220;");
    break;
....

そして、他の回答で述べられているように、あなたはあなたのリテラルの1つに/代わりを持っています。\

于 2009-11-13T21:08:11.447 に答える
4

リテラル文字 (つまり、'‘') を使用できますが、ビルド プロセスでは、コンパイル時に正しいソース エンコーディングを指定する必要があります。javacコマンドオプションは-encoding. (Ant のjavacタスクの属性は同じです。) これは、ファイルを保存するときに IDE で使用されるエンコーディングと一致する必要があります。

たとえば、IDE が UTF-8 を使用しているが、ビルド マシンが US-ASCII のプラットフォームのデフォルト エンコーディングを使用している場合、特殊文字は としてデコードされ?ます。複数のケースが同じラベルを持つようになったため、元のエラー メッセージが表示されます。

于 2009-11-13T21:14:26.297 に答える
3

コンパイラの問題は、「\u8221」の代わりに「/u8221」(バックスラッシュの代わりにスラッシュ)を使用しているためです。

エンティティを使用することが役立つとは完全には確信していませんが、試してみることができます...ダウンストリームコードがどれだけ壊れているかによると思います。

編集:Doh、Unicode値が10進数であることに気づいていませんでした。はい、16進数である必要があります:)コンパイラが文句を言った理由を説明しているので、この回答はここに残しておきます-'\ u8221'は完全に文字のエスケープシーケンスであり、必要なものではありません:)

于 2009-11-13T21:07:29.930 に答える
0

より良いアプローチは、Apache Commons Lang http://commons.apache.org/lang/api/org/apache/commons/lang/StringEscapeUtils.htmlを使用することです。

于 2009-11-14T10:03:59.690 に答える
0

デフォルトのエンコーディングはプラットフォームごとに異なります。Windows は独自の ISO-Latin-1 方言 (少なくとも私が取り組んだもの) を使用します。Linux は頻繁に UTF-8 を使用し (これがおそらく問題です)、Mac は MacRoman を使用します。ソースコードで必要な場合は、プレーンな 7 ビット ASCII を維持し、それより上のものに \u を使用することで、ほとんどの問題を回避できます。

個人的には、Java ソースの外部に「国別」のものをすべて保持し、ローカリゼーション機能を使用して単純なキーの翻訳済み文字列を検索し、それらを Java コードに配置します。

于 2009-11-13T21:52:23.127 に答える