質問

巻き毛の引用がある文字列があります。それらを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 Escapingを使用することでした。残念ながら、これは私のMacにコンパイルさえしません:

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

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

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

私は、この少しの代替を行い、プラットフォーム全体でそれを確実に機能させる方法について困惑しています。誰かがポインターを持っていますか?前もって感謝します。

役に立ちましたか?

解決

コンパイラの問題は、「 u8221」の代わりに「/u8221」を持っているためです - バックスラッシュの代わりにフォワードスラッシュです。

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

編集:ああ、私はあなたのユニコード値が小数点であることを見つけていませんでした。はい、彼らはヘックスにいる必要があります:)コンパイラが不平を言っている理由を説明するので、ここにこの答えを残します - 「 u8221」は完全にキャラクターエスケープシーケンスであり、あなたが望んでいたものではありません:)

他のヒント

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

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

ユニコードリテラルは16進んでいます。

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

そして、他の答えで述べたように、あなたは / aの代わりに \ あなたのリテラルの1つで。

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

個人的には、Javaソースの外側に「全国」を維持し、ローカリゼーション機能を使用して、シンプルなキーの翻訳された文字列を調べます 彼ら Javaコードに配置されます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top