2011-10-24 7 views
5

GSONでJSONレスポンスを処理しようとしている間に(私が尋ねている場合は、出力はflickr APIからのものです)、私はかなり奇妙なエンコーディング特定の特殊文字の:GSON/JSON:奇妙な特殊文字(ウムラウト)の問題

Original JSON response

ここでの六角ビューです:

Hex View of Original JSON response

「U」が「ダブルドット」に続いて "ドイツのことになっているものですü '、これは私の混乱がどこにあるのか開始する。それは、誰かがチャーを取り、2つの部分のそれぞれを符号化して半分に裂いたようなものです。以下の画像は、私はそれがケースに「U」を正しくエンコードされたことを期待するものの進エンコーディングを示しています

Expected Hex View

さらに奇妙な、私は問題が発生することが期待される場合は(すなわち、 、アジアの文字セット)すべてが正常に動作するように見えます。 "タイトル": "ナガレテユク···"

質問:

  1. をその一部flickrAPIの風変わりまたはreposonseの正しいJSONエンコーディングですか?それとも、正しくエンコードされたJSONで、GSONで、この応答を元の 'ü'に '再組み立て'できませんでした。あるいは、タイトルメッセージの作者は単にそれを自分の部分にねじ込むだけでしたか?
  2. 問題を解決するにはどうすればいいですか(JSONかGSONのどちらかが混乱している場合は、作成者の場合は明らかに何もできません)。どのように他の文字が影響を受けているかを知るには(öとäが頭に浮かぶが、おそらくもっと特殊なケースがある)。あなたがUnicode decompositionの場合があります見ている何

答えて

4

ドイツ語のウムラウトのような文字は以下の2つの方法で表現することができます。

  • 単一の文字üような、より伝統的な合成済みフォームまたは
  • ベース文字としてuが続き、それに続くcombining diaeresis̈_(私はそれがsupposではないので表示するために下線を使用しなければならなかったスタンドアロンするエド、それは本当に単なる「点をホバリング」するためです)

あなたはこのような何かを受け取った場合、それは簡単に)は、Java 1.6以降で利用可能java.text.Normalizerを(使用して合成済み形式に変換されます:

String decomposed = "Mitgef\u0308hl"; 
printChars(decomposed); // Mitgefühl -- [M, i, t, g, e, f, u, ̈, h, l] 
String precomposed = Normalizer.normalize(decomposed, Form.NFC); 
printChars(precomposed); // Mitgefühl -- [M, i, t, g, e, f, ü, h, l] 

// Normalizing with NFC again doesn't hurt: 
String precomposedAgain = Normalizer.normalize(precomposed, Form.NFC); 
printChars(precomposedAgain); // Mitgefühl -- [M, i, t, g, e, f, ü, h, l] 
... 

static void printChars(String s) { 
    System.out.println(s + " -- " + Arrays.toString(s.toCharArray())); 
} 

ご覧のとおり、あらかじめ合成された文字列にNFCを適用しても問題ありません。

Stringの印刷は、分解されたフォームとあらかじめ合成されたフォームの違いがわかる文字配列を印刷する場合に限り、Unicode対応のターミナルで正しく表示されることに注意してください。

考えられる原因は、分解された形で物をエンコードする傾向のあるMacOSかもしれませんが、Flickrがこの物を正規化しないのは興味深いです。

+0

なぜ下降者が説明できますか? –