2011-10-24 33 views
5

Trong khi cố gắng xử lý phản hồi JSON với GSON (đầu ra là từ API flickr trong trường hợp bạn đang hỏi) Tôi đã gặp phải những gì tôi mô tả dưới dạng mã hóa khá lạ của một số ký tự đặc biệt:GSON/JSON: Vấn đề char đặc biệt (umlaut)

Original JSON response

Dưới đây là một cái nhìn hex của nó:

Hex View of Original JSON response

các 'u' tiếp theo là 'đúp chấm' là những gì cho là một người Đức ' ü ', và đây là nơi mà sự nhầm lẫn của tôi bắt đầu. Nó như thể ai đó lấy chiếc xe và tách nó ra làm đôi, mã hóa từng mảnh. Những hình ảnh dưới đây cho thấy các mã hex của những gì tôi mong đợi nó được trong trường hợp 'U' được mã hóa một cách chính xác:

Expected Hex View

Thậm chí nhiều hơn lạ, trong trường hợp tôi mong chờ các vấn đề xảy ra (cụ thể là , bộ ký tự châu Á) mọi thứ dường như hoạt động tốt, ví dụ "Title": "ナ ガ レ テ ユ ク · · ·"

Câu hỏi:

  1. Có phải đó là một số kỳ quặc flickrAPI hoặc mã hóa JSON chính xác cho các reposonse? Hoặc là nó được mã hóa đúng JSON và GSON không thể 'tái lắp ráp' phản ứng này vào 'ü' ban đầu. Hay tác giả của thông điệp tiêu đề chỉ đơn giản là vặn nó vào phần của anh ta?
  2. Làm cách nào để giải quyết vấn đề (trong trường hợp đó là JSON hoặc GSON đang rối tung xung quanh, rõ ràng không thể làm bất cứ điều gì nếu đó là tác giả). Làm thế nào để tôi biết những ký tự 'khác' bị ảnh hưởng (ö và ä đến tâm trí, nhưng có lẽ có nhiều 'trường hợp đặc biệt').

Trả lời

4

gì bạn nhìn thấy ở đó là một trường hợp của Unicode decomposition:

nhân vật như umlauts Đức có thể được thể hiện bằng hai cách:

  • dạng precomposed truyền thống hơn như một ký tự đơn ü hoặc
  • ở dạng bị phân tách làm ký tự cơ sở u, theo sau là combining diaeresis̈_ (Tôi phải sử dụng dấu gạch dưới đây để hiển thị dưới dạng hiển thị vì nó không phải là biểu tượng ed để đứng một mình, nó thực sự chỉ là "chấm lơ lửng" đến)

Nếu bạn nhận được một cái gì đó như thế này, nó dễ dàng chuyển đổi thành dạng precomposed bằng cách sử dụng java.text.Normalizer (có sẵn từ Java 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())); 
} 

Như bạn có thể thấy, áp dụng NFC cho một chuỗi đã được định trước không bị tổn thương.

Lưu ý rằng in String sẽ xem chính xác trên bất kỳ thiết bị đầu cuối có khả năng Unicode nào, chỉ khi bạn in mảng ký tự, bạn thấy sự khác biệt giữa biểu mẫu bị phân tách và được định trước.

Một nguồn có thể có thể là MacOS có xu hướng mã hóa mọi thứ ở dạng bị phân tách, thật là tò mò rằng Flickr không bình thường hóa công cụ này.

+0

Trình gỡ xuống có thể giải thích tại sao không? –

Các vấn đề liên quan