2011-10-24 6 views
5

GSON으로 JSON 응답을 처리하는 중 (요청할 경우 flickr API의 출력 결과 임) 나는 이상한 인코딩으로 묘사 한 것을 발견했습니다. 특정 특수 문자 :GSON/JSON : 이상한 특수 문자 (움라우트) 문제

여기 Original JSON response

는 16 진수보기입니다 :

Hex View of Original JSON response

'U'가 '두 점'에 이어 독일어해야하는데 무엇인가 ' ü ', 그리고 이것은 나의 혼란 시작됩니다. 그것은 마치 누군가가 숯을 가지고 반으로 찢어서 2 조각을 각각 부호화하는 것과 같습니다. 다음 이미지는 내가이 경우에 'U'가 제대로 인코딩 된 것으로 예상했던 것과의 진수 인코딩을 보여줍니다

Expected Hex View

더욱 이상한, 나는 문제가 발생하는 기대 경우 (즉, , 아시아 문자 집합) 모두 잘 작동하는 것, 예 : "제목": "ナ ガ レ テ ユ ク · · ·"

질문 :

  1. 인가 그 reposonse에 대한 몇 가지 flickrAPI의 이상한 또는 올바른 JSON 인코딩? 아니면 오히려 제대로 인코딩 된 JSON이며 그것은 원래 'ü'로이 응답을 '다시 조립'실패 GSON이야. 아니면 제목 메시지의 저자가 단순히 자신의 부분에 그것을 망쳐 놨니?
  2. 문제를 해결하는 방법 (JSON 또는 GSON이 엉망인 경우 작성자 인 경우 분명히 아무 것도 할 수 없음). 어떻게 '다른'문자가 영향을 받는지 알 수 있습니까? (ö 및 ä가 마음에 들지만, 아마도 '특별한 경우가 더 많습니다').

답변

4

당신이 Unicode decomposition의 경우가보고있다 : 독일어 움라우트 같은

문자는 두 가지 방법으로 표현 될 수는 :

  • 하나의 문자로 전통적인 사전 구성된 형태 ü 또는
  • 으로 분해 된 형태로 기본 문자 u 다음에 combining diaeresis̈_ (여기에는 밑줄을 사용하여 표시해야합니다. 에드는

이 뭔가를받을 경우 쉽게) 자바 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의 인쇄는 문자 배열을 인쇄 할 때만 분해되고 사전 합성 된 양식의 차이가 나타나는 경우에만 유니 코드 가능 터미널에서 올바르게 표시됩니다.

가능한 소스는 분해 된 형태로 항목을 인코딩하는 경향이 있지만, Flickr가이 항목을 표준화하지 않는다는 것이 궁금합니다.

+0

downvoter 이유를 설명해주세요. –