web-dev-qa-db-ja.com

UTF-8でエンコードされたデータをサーバーに送信すると特定の文字が失われる

サーバー(JavaEEアプリ)とクライアント(Androidアプリ)の通信を含むプロジェクトに取り組んでいます。 XMLは、HTTP要求のPOSTパラメータ(「xml」という名前))の1つとして送信されます。他にPOSTパラメータをサーバーに渡し、しかし、以下の機能では、簡単にするためにそれらを削除しました。発生する問題は、特定の文字がサーバーに適切に配信されないことです-たとえば、文字Ű(これはドイツ語ではないことに注意してくださいÜ、これは適切に配信されます。送信用のコードは次のとおりです。

private String postSyncXML(String XML) {
    String url = "http://10.0.2.2:8080/DebugServlet/DebugServlet";
    HttpClient httpclient = new DefaultHttpClient();  

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("xml",XML));

    UrlEncodedFormEntity form;
    try {
        form = new UrlEncodedFormEntity(nameValuePairs);
                form.setContentEncoding(HTTP.UTF_8);
        HttpPost httppost = new HttpPost(url);

        httppost.setEntity(form);

        HttpResponse response = (HttpResponse) httpclient .execute(httppost);
        HttpEntity resEntity = response.getEntity();  
        String resp = EntityUtils.toString(resEntity);
        Log.i(TAG,"postSyncXML srv response:"+resp);
        return resp;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

私の推測では、XMLをPOSTパラメーターの1つとして設定するために使用するBasicNameValuePairに問題があり、ドキュメントにはUS-ASCII文字セットが使用されています。UTF- 8エンコードPOSTフィールド?

42
dstefanox

多くの研究と物事を機能させようと試みた後、私は最終的に問題の解決策を見つけました。それは既存のコードへの簡単な追加です。解決策は、UrlEncodedFormEntityクラスコンストラクターでパラメーター「UTF-8」を使用することでした。

form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");

この変更後、文字はエンコードされ、サーバー側に適切に配信されました。

100
dstefanox

この行をするとき

form = new UrlEncodedFormEntity(nameValuePairs);

このような文字セットを指定する必要があります

form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");

Android Developer find。

DEFAULT_CONTENT_CHARSET のデフォルトエンコーディングでパラメータのリストを持つ新しいUrlEncodedFormEntityを構築します

21
BobGao
String finalString = URLEncoder.encode(request, "UTF-8");

return finalString;

postメソッドのユーザーfinalString。

3
AZ_

または、test2.jspxの上部にあるスクリプトレットに以下のコードを追加して、問題を解決できます。


   
     String en = request.getCharacterEncoding();
     if(en == null) {
      request.setCharacterEncoding("UTF-8");
     }
   
1
Amol Gaikwad

これが、AndroidからUTF-8データを送信する際の問題でした。 StringBase64にエンコードする必要がある場合を除き、コードは正常に機能します。サーバーでPHPあなたはBase64文字列をデコードするだけです。それは私のために働きました。コードが必要であれば共有できます。

0
Mukund K Roy

私も同様の問題に直面しました。しかし、それを確認するために、2つのJSPを以下に書きました

------------- test1.jspx -----------------

<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:jsp="http://Java.Sun.com/JSP/Page" version="2.0">
  <jsp:directive.page contentType="text/html; charset=utf-8"/>
<body>
      <form action="/test2.jspx" method="POST" accept-charset="UTF-8">
                            <input type="text" name="u" id="u" />
                            <input type="submit" value="Login3" />
    </form>
</body>
</html>

-------------test2.jspx-----------------
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:jsp="http://Java.Sun.com/JSP/Page" version="2.0">

<jsp:directive.page contentType="text/html; charset=utf-8"/>
<body>
    The test entered is <jsp:expression>request.getParameter("u")</jsp:expression>
</body>
</html>
----------------------------------

そして、最初の入力ボックスにあるアクセント記号付きの文字の下にÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäååæçèéêëììîîïðñòóôõöøùúûüýþÿ

また、AndroidブラウザーはPOSTパラメーターでUTF-8エンコードを処理できません。

GETメソッドを使用し、Tomcat server.xmlのコネクタに「URIEncoding = UTF-8」を追加する必要があると思います。

0
Amol Gaikwad