2015-10-20 77 views
1

我有一個REST Web服務,它以JSON(作爲多部分表單數據)的形式輸入。輸入字符串編碼,需要原始字符串 - Java代碼

@POST 
@Consumes ({"application/ds-json",MediaType.APPLICATION_FORM_URLENCODED,MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML,"text/html",MediaType.MULTIPART_FORM_DATA}) 
@Produces({ text_html, "application/ds-json" }) 
@Path("/abc") 
public Response abc(@Context HttpServletRequest req, @Context HttpServletResponse response){ 
      . 
      . 
      . 
      . 
    String strInput = inputJSON.getString("data"); 
      . 
      . 
      . 
} 

輸入JSON,我送是{"data":"Sécurité"},而串strInput我得到的價值是Sécurité

我試圖java.net.URLDecoder.decode(strInput, "iso-8859-1")將其解碼回其原有的特色,但未能成功。

我也試過String strInput = new String((inputJSON.getString("data")).getBytes(), "iso-8859-1");預期傳入的字符將按照需求存儲在變量strInput中,但失敗。

我覺得完全迷失在這裏。有人可以幫忙嗎?


編輯:

更清晰,下面是究竟如何我送了JSON這一服務(僅用於測試目的):

  1. 我已經創建了一個HTML頁面可以發送POST請求的Web服務

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
 
    <title>Insert title here</title> 
 
</head> 
 

 
<body> 
 

 
    <form action="http://localhost:8080/xxxx/abc" method="POST" enctype="multipart/form-data"> 
 

 
    JSON: 
 
    <input type="text" name="data"> 
 
    <input type="submit" name="submit"> 
 
    </form> 
 
</body> 
 

 
</html>

  • 在頁面,我輸入文本作爲使用UTF-16Sécurité
  • +0

    嘗試UTF-8或UTF-16,可能? –

    +1

    你在哪裏看到錯誤的編碼字符串?在你的IDE,數據庫或其他地方? – Patrick

    +0

    在我的IDE,後來我送這個字符串用作電子郵件主題行的電子郵件通知。還有它顯示爲相同的'Sécurité' –

    回答

    0

    謝謝大家,我總算解決這個問題,@ kayaman的評論幫助我到達這裏

    你看到的是UTF-8的數據解碼爲ISO-8859-1。 - Kayaman

    我剛轉換的輸入字符串strInput到字節每ISO-8859-1編碼和再次創建新的字符串按照UTF-8編碼。這爲我做了這份工作。

    byte[] inputBytes = strInput.getBytes("iso-8859-1"); 
    strInput = new String(inputBytes, "UTF-8"); 
    

    早些時候,我獲取輸入字符串的字節byte[] inputBytes = strInput.getBytes();它默認是返回我這是比我預期的額外字節UTF-8解碼的位元(我提到,@Kayaman):

    @Kayaman是的,你是非常正確的,我在一個單獨的測試課上進行測試。但在我目前的情況下(網絡服務),我作爲輸入獲得的數據似乎以某種方式被破壞。我試圖打印輸入和期望的字符串的字節:字節[] S = strInput.getBytes(「UTF-8」); byte [] s1 =「安全」.getBytes(「UTF-8」);其結果是:s = [83,-61,-125,-62,-87,99,117,114,105,116,-61,-125,-62,-87] s1 = [83,-61, -87,99,117,114,105,116,-61,87]這兩個應該是相同的,但是我得到額外的字節{-125,-62} - Ankan Priya

    但是,作爲字符串是ISO-8859-1編碼形式,我需要使用相同的解碼方案來獲取字節和它的工作(見上文的代碼片段)

    1

    所有的Java字符存儲在存儲器中。問題來自傳輸的字節。你寫

    我送是{"data":"Sécurité"}

    它只是一種表象,它沒有提供有關用於文本傳輸字節表示的信息。如果使用的表示不是響應的一部分,則接收器不能創建它。如果缺少編碼,發件人和消費者都必須依賴相同的約定。例如,某些協議有默認值,但這意味着發送者和接收者都遵守標準默認值,並且它們也必須與規範同步(默認編碼隨時間變化)。

    從您的具體問題,當您的Java請求處理器已收到發送的字節,它已使用Charset將其轉換爲Java char。不支持的字節在此轉換中丟失。

    的可能的解決方案:

    1. 使發件人ALWAYS specifiy使用的編碼
    2. 添加一個猜測基於一些請求元數據的默認編碼的請求過濾器(即User-Agent
    3. 停止使用IE(如據我所知,IE8的確做錯事與編碼,特別是XHR)

    注:must-read文章:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

    0

    嘗試在消耗參數添加:

    + 「;字符集= UTF-8」

    POR例如:

    MediaType.APPLICATION_JSON +「;字符集= UTF -8「

    我使用它,但與輸出和工作正常。

    +0

    我試過,但沒有真正的幫助。整個問題仍然完全相同。 –