2011-10-24 16 views
5

GSON साथ एक JSON प्रतिक्रिया (उत्पादन मामले आग्रह कर रहे हैं में फ़्लिकर एपीआई से है) मैं का सामना करना पड़ा है कि मैं क्या एक बहुत अजीब एन्कोडिंग के रूप में वर्णन होता संसाधित करने का प्रयास करते समय कुछ विशेष वर्ण:GSON/JSON: अजीब विशेष वर्ण (ऊमलायूट) मुद्दा

Original JSON response

यहाँ इसके बारे में एक हेक्स दृश्य है:

Hex View of Original JSON response

'यू' 'डबल डॉट्स' के बाद क्या एक जर्मन माना जाता है ' ü ', और यह वह जगह है जहां मेरा भ्रम है शुरू होता है। ऐसा लगता है जैसे किसी ने चार ले लिया और इसे आधे में फिसल दिया, प्रत्येक 2 टुकड़ों को एन्कोडिंग किया। निम्न छवि क्या मैं इसे मामले में होना करने के लिए 'यू' सही ढंग से इनकोडिंग था उम्मीद थी की हेक्स एंकोडिंग पता चलता है:

Expected Hex View

इससे भी अधिक अजीब, ऐसे मामलों में जहां मैं समस्याएं होती हैं की उम्मीद करेंगे में (अर्थात्

, एशियाई चरित्र सेट) सबकुछ ठीक काम करता प्रतीत होता है, उदाहरण के लिए "शीर्षक": "ナ ガ レ テ ユ ク · · ·"

सवाल:

  1. है कि कुछ flickrAPI विषमता या reposonse के लिए सही JSON एन्कोडिंग? या यह जेएसओएन और उसके जीएसओएन को सही ढंग से एन्कोड किया गया है जो मूल 'ü' में इस प्रतिक्रिया को 'पुनः इकट्ठा' करने में असफल रहा है। या शीर्षक संदेश के लेखक ने बस इसे अपने हिस्से पर पेंच दिया?
  2. मैं कैसे समस्या को हल करते हैं (मामले में यह या तो JSON या GSON कि चारों ओर खिलवाड़ है, अगर यह लेखक थे जाहिर है कुछ भी नहीं कर सकते हैं)। मुझे कैसे पता चलेगा कि 'अन्य' वर्ण क्या प्रभावित होते हैं (ö और ä दिमाग में आते हैं, लेकिन शायद अधिक 'विशेष मामले' हैं)।

उत्तर

4

आप जो देख रहे Unicode decomposition का मामला है:

वर्ण जर्मन उमलॉट की तरह दो तरह से व्यक्त किया जा सकता:

  • एक भी चरित्र के रूप में और अधिक परंपरागत precomposed रूप ü या
  • आधार चरित्र u के रूप में विघटित रूप में combining diaeresis̈_ (मुझे इसे दिखाने के लिए यहां अंडरस्कोर का उपयोग करना था क्योंकि यह suppos नहीं है एड अकेले खड़े करने के लिए, यह वास्तव में सिर्फ करने के लिए "मँडरा डॉट्स" है)

आप कुछ इस तरह प्राप्त होता है, यह आसानी से java.text.Normalizer (उपलब्ध का उपयोग करके precomposed रूप में परिवर्तित किया है जावा 1.6 के बाद से):

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 प्रिंटिंग किसी भी यूनिकोड-सक्षम टर्मिनल पर सही ढंग से दिखाई देगी, केवल तभी जब आप वर्ण सरणी मुद्रित करते हैं तो आप विघटित और पूर्वकल्पित रूप के बीच अंतर देखते हैं।

एक संभावित स्रोत MacOS कि विघटित रूप में चीजों को एन्कोड करने के लिए जाता है हो सकता है, यह फ़्लिकर इस सामग्री को सामान्य नहीं है कि, हालांकि उत्सुक है।

+0

downvoter बताएगा कि ऐसा क्यों कर सकते हैं? –

संबंधित मुद्दे