エスケープ文字とエンコーディングを変換する

私はJavaのDateオブジェクトにStringを解析する必要があります。 ロケールが French に設定されたパターン MMM d yyyy HH:mm:ss z の文字列を取得します。

The problem occures when the date is in february, august or december due to encoding of french accents. For example, I get déc. 15 2011 16:55:38 CET for december 15th 2011.

私は文字列の作成方法を変更することができないので、私の側の悪いエンコーディングに対処しなければなりません。生成された文字列がひどくエンコードされている(UTF-8コンテンツがISO 8859-1としてエンコードされている)場合、エスケープしているようです。

今のところ私は以下を使用します:

stringFromXML = stringFromXML.replaceAll("é", "é");
stringFromXML = stringFromXML.replaceAll("û", "û");

フランス語の唯一のアクセントはéûですが、文字をエスケープして変換するためのよりクリーンな方法があるからです。

3

3 答え

あなたは2つのステップが必要です:

  1. Resolve numeric character references, for example, using StringEscapeUtils as suggested by Andy:

    String unescaped = StringEscapeUtils.unescapeHtml(in);
    
  2. Fix encoding by treating characters as UTF-8 code units:

    String out = new String(unescaped.getBytes("ISO-8859-1"), "UTF-8");
    
10
追加された
あなたは入力が同じであると確信していますか?
追加された 著者 axtavt,
@YCI:さらなる処理の結果ではないと確信していますか?この変換の結果を16進数で出力し、出力の問題を排除してください。
追加された 著者 axtavt,
このソリューションは私のコンピュータ上で動作しますが、サーバ上では例外が発生します:java.text.ParseException:Unparseable date: "ao�t04 2011 16:55:38 CEST" 。エンコーディングの修正により、aoûtではなくao�tが返されます。それはどこから来たの?
追加された 著者 YCI,
文字列はXMLファイルから読み込まれます。このXMLをテキストエディタで開くと、エンコードは BOMなしのUTF-8 として識別されます。次のフィールドから値を読み取りました: a04 2011 16:55:38 CEST 私のコンピュータ(Windows XP、Java 1.6.0_11)では値が ao t から ao tt aoûtに変更されます。サーバー(RedHat 5.4、java 1.6.0_21)では値が ao t から ao t ao @ tt に変更されます。
追加された 著者 YCI,
あなたは私のログファイルにエンコードの問題があります。 new String(unescaped.getBytes( "ISO-8859-1")、 "UTF-8")で文字列を再エンコードせずに unescapeHTML ); それは少し奇妙ですが、それは動作します...あなたの助けをありがとう!
追加された 著者 YCI,

依存関係に気にしない場合は、Apache Commons StringEscapeUtilsを使用してこれを行うことができます。

JavaDoc for StringEscapeUtils.unescapeHtml

Unescapes a string containing entity escapes to a string containing the actual Unicode characters corresponding to the escapes. Supports HTML 4.0 entities.

For example, the string "<Français>" will become ""

また、あなたの入力にあるような数値エンティティでも動作するはずです。

2
追加された

Just in case someone else is looking for the same solution as me. I was trying to decode characters that I got from okhttp (android) requests like: Ã to Ã

@axtavtの示唆したように、 StringEscapeUtils を使用しましたが、そうするために、この依存関係を自分のgradleに追加しました:

compile 'org.apache.commons:commons-lang3:3.4'

固定文字の問題

return StringEscapeUtils.unescapeHtml3(word);        
2
追加された