2012-12-19 45 views
6

我在Gson中使用Umlauts(ä,ü,ö),我需要通過Http Post Body傳遞。Java:Gson和編碼

不幸的是,我的web應用程序將返回null,如果變音沒有被轉換,他們不是。

內容類型是「應用/ JSON」

我如何告訴GSON正確編碼變音(中變音是在價值觀,而不是鑰匙)?

+1

「我的web應用程序將返回null,如果變音不以某種方式轉換」,所以這個問題是web應用程序。 –

+0

這是一個MVC 4應用程序,如果有幫助。應該接受沒有編碼在體內的變音符號? – cdbeelala89

+0

'application/json'必須接受Unicode(因此也就是Umlauts)。[spec](http://www.ietf.org/rfc/rfc4627.txt):_「JSON文本應以Unicode編碼。默認編碼是UTF-8。「_如果Web應用程序不接受這個,它不接受JSON。 – McDowell

回答

2

你可以嘗試設置

charset=UTF-8 

迫使編碼。

+0

不幸的是這並沒有幫助(在http標題中設置它) – cdbeelala89

0

在傳遞給gson之前,可以將Umlauts編碼爲十進制實體。從json中你可以解碼這些實體的 。

/* encode unicode characters in a given string */ 
    private static String getEncodedText(String text) { 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < text.length(); i++) { 
      char ch = text.charAt(i); 
      int codePoint = text.codePointAt(i); 

      if (codePoint >= 0 && codePoint <= 126 
        && (codePoint != 34 && codePoint != 39 
          && codePoint != 60 && codePoint != 62 
          && codePoint != 94 && codePoint != 96 && codePoint != '_')) { 
       sb.append(ch); 
       continue; 
      } 


      sb.append(convertToEntity(String.valueOf(codePoint))); 
     } 

     return sb.toString(); 
    } 


    public static String convertToEntity(String decimalValue) { 
     return "&#" + decimalValue+ ";"; 
    } 
+0

我該怎麼做?通常我只是爲了toGson(對象)。 – cdbeelala89

+0

將值設置爲要轉換的對象變量ti json將上述方法應用於編碼字符串。 –

6

我有同樣的問題將變音符傳遞給JSON中的Web服務。 網絡服務器無法正確解碼這些字符。通過配置HttpClient的爲UTF編碼問題就消失了,這是我的工作代碼:

HttpParams httpParams = new BasicHttpParams(); 
HttpProtocolParams.setContentCharset(httpParams, HTTP.UTF_8); 
HttpProtocolParams.setHttpElementCharset(httpParams, HTTP.UTF_8); 
HttpClient client = new DefaultHttpClient(httpParams); 
HttpPost request = new HttpPost(serverURL); 
StringEntity str = null; 
String jsonString = gson.toJson(yourdata); 
str = new StringEntity(jsonString, HTTP.UTF_8); 
request.setEntity(str); 
request.setHeader("Accept", "application/json"); 
request.setHeader("Content-type", "application/json"); 
client.execute(request); 
+0

謝謝,httpParams在我的情況下是缺失的部分。 – Locked