6

我在AppEngine上託管了一個簡單的Restlet服務。這使用字符串執行基本的CRUD操作,並且當我使用curl對所有動詞進行測試時,它可以很好地處理各種UTF-8字符。在幾乎所有我在servletUTF-8字符串被GAE上的Restlet加擾

// set response type 
resp.setContentType("application/json"); 
// Create the client resource 
ClientResource resource = new ClientResource(Messages.SERVICE_URL + "myentity/id"); 
// Customize the referrer property 
resource.setReferrerRef("myapp"); 
// Write the response 
resource.get().write(resp.getWriter()); 

以上:

這是由一個Servlet託管在其他的AppEngine應用一個簡單的Restlet客戶機消耗的。很樸實。

該servlet通過jQuery AJAX調用,那我回去了JSON是良好和一切,但問題是,UTF-8編碼字符串回來炒,例如: Université de Montréal成爲Universit?? de Montr??al

我試圖在servlet中加入這一行(一切前):

resp.setCharacterEncoding("UTF-8"); 

但唯一性差異的是,而不是讓??我得到Universitᅢᄅ de Montrᅢᄅal(我甚至不知道什麼樣的角色的那些是,亞洲我想)。

我100%確定restlet服務是可以的,因爲除了一行一行的調試以外,我可以使用curl從cmd行測試它,它返回格式良好的字符串。

通過查看來自firefox的響應的http頭(當通過javascript調用servlet時),我可以看到編碼的確如預期的那樣是UTF-8。經過幾個小時的努力閱讀每一個可能的相關文章,我碰到this restlet discussion,並注意到,確實我有Transfer-Encoding: chunked在響應的http頭上。我想提出的解決方案(覆蓋ClientResource.toRepresentation,沒有任何好處,所以我嘗試的Restlet 2.1與ClientResource.setRe​questEntityBuffering​(true) susggested,沒有運氣有其一),但我不相信我的問題是,在所有有關Transfer-Encoding: chunked

此時我出於想法,我會真的感謝任何建議! O_O

UPDATE

我試圖做一個經典的URLConnection手動GET和字符串回來好嗎:

URL url = new URL(Messages.SERVICE_URL + "myentity/id"); 
URLConnection conn = url.openConnection(); 
InputStream is = conn.getInputStream(); 

StringWriter writer = new StringWriter(); 
IOUtils.copy(is, writer, "UTF-8"); 

resp.getWriter().print(writer.toString()); 

這麼多的是所有的RESTful和花哨的......但仍然我不知道爲什麼原始版本不起作用! :/

+1

分塊傳輸編碼應該與字符集問題無關......如果將有問題的原始字符串寫入'resp.getWriter()',完全繞過restlet,是否正確傳輸? – bdonlan 2011-12-31 06:12:07

+0

您的意思是通過從servlet執行「手動」GET來獲得我的服務? – JohnIdol 2011-12-31 06:36:14

+0

看到更新,如果我繞過restlet,它工作正常。我想這是一個restlet錯誤或smt O_o – JohnIdol 2011-12-31 07:12:38

回答

1

我試圖做一個經典的URLConnection手動GET和字符串回來好嗎:

URL url = new URL(Messages.SERVICE_URL + "myentity/id"); 
URLConnection conn = url.openConnection(); 
InputStream is = conn.getInputStream(); 

StringWriter writer = new StringWriter(); 
IOUtils.copy(is, writer, "UTF-8"); 

resp.getWriter().print(writer.toString()); 

這麼多的是所有的RESTful和花哨的......但我仍然不知道爲什麼原始版本不起作用! :/

0

您的迴應是否包含適當的「Content-Type」標題?它應該像「Content-Type: application/json; charset=UTF-8」(注意字符集)。

嘗試啓動您的開發服務器並使用cURL從命令行中檢索您的資源並檢查標題,例如curl -i http://localhost:8080/myentity/id。理論上瀏覽器應該爲JSON採用UTF-8,但我不會相信這一點。