15

アプリ エンジンが文字エンコーディングをどのように処理するかについての説明を探しています。サーバーがアプリエンジン上にあるクライアントサーバーアプリケーションに取り組んでいます。

これはゼロから構築された新しいアプリケーションであるため、どこでも UTF-8 を使用しています。クライアントは、POST、x-www-form-urlencoded を介していくつかの文字列をサーバーに送信します。私はそれらを受け取り、エコーバックします。クライアントがそれを取り戻すと、それは ISO-8859-1 です! また、パラメーターが UTF-8 でエンコードされた multipart/form-data として送信され、ブロブストアに POST するときにもこの動作が見られます。

記録のために、私はこれを Wireshark で見ています。したがって、UTF-8 を送信して ISO-8859-1 を受信すると 100% 確信しています。また、mojibake も表示されません。ISO-8859-1 でエンコードされた文字列はまったく問題ありません。これは、Content-Type の誤解の問題でもありません。それはクライアントではありません。途中で、私が UTF-8 パラメータを送信していることを正しく認識していますが、何らかの理由で ISO-8859-1 に変換しています。

私は、ISO-8859-1 が GAE サーブレットのデフォルトの文字エンコーディングであると信じています。私の質問は、GAE に ISO-8859-1 に変換せず、代わりにどこでも UTF-8 を使用するように指示する方法はありますか?

サーブレットが次のようなことをするとしましょう:

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    resp.setContentType("application/json");
    String name = req.getParameter("name");
    String json = "{\"name\":\"" + name + "\"}";
    resp.getOutputStream().print(json);
}

レスポンスとリクエストの文字コードを「UTF-8」にしてみましたが、変わりませんでした。

前もって感謝します、

4

4 に答える 4

17

私はあなたがしなければならない2つのことを見ます。

1)appengine-web.xmlでsystem-properties(使用している場合)をutf8に設定します

<system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
    <property name="file.encoding" value="UTF-8" />
    <property name="DEFAULT_ENCODING" value="UTF-8" />
</system-properties>

上記は私が持っているものですが、ドキュメントはこれを以下に提案しています:

<env-variables>
    <env-var name="DEFAULT_ENCODING" value="UTF-8" />
</env-variables>

https://developers.google.com/appengine/docs/java/config/appconfig

2) コンテンツタイプを設定するときにエンコーディングを指定します。そうしないと、デフォルトに戻ります

コンテンツタイプには、使用される文字エンコーディングのタイプが含まれる場合があります(例:text / html)。charset=ISO-8859-4。

やってみます

resp.setContentType("application/json; charset=UTF-8");

コンテンツタイプを直接設定できるライターを試すこともできます。

http://docs.oracle.com/javaee/1.3/api/javax/servlet/ServletResponse.html#getWriter%28%29
http://docs.oracle.com/javaee/1.3/api/javax/servlet/ServletResponse .html#setContentType(java.lang.String)

価値があるので、日本語のコンテンツにはutf8が必要で、問題はありません。とにかくフィルターやsetContentTypeを使用していません。上記のgwtと#1を使用していますが、機能します。

于 2012-08-10T21:58:58.023 に答える
7

それを回避する方法を見つけました。これが私がやった方法です:

  • content-type として「application/json; charset=UTF-8」を使用しました。または、応答文字セットを「UTF-8」に設定します (どちらでも問題なく動作します。両方を行う必要はありません)。

  • ASCII セーフではなく、UTF-8 として提供される入力文字列を Base64 でエンコードしました。そうしないと、明らかにサーブレットに到達したときに ISO-8859-1 に変換されます。

  • resp.getOutputStream() の代わりに resp.getWriter() を使用して、JSON 応答を出力しました。

これらすべての条件が満たされた後、最終的に UTF-8 をクライアントに出力することができました。

于 2012-08-21T14:30:35.710 に答える
1

これはGAEに固有のものではありませんが、役立つと思われる場合は、独自のフィルターを作成しました。

web.xml内

<filter>
    <filter-name>charsetencoding</filter-name>
    <filter-class>mypackage.CharsetEncodingFilter</filter-class>
</filter>
    ...
<filter-mapping>
   <filter-name>charsetencoding</filter-name>
   <url-pattern>/*</url-pattern> 
</filter-mapping>

(filter-mappingフラグメントをfilter-mappingsのかなり先頭に配置し、url-patternを確認します。

public class CharsetEncodingFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        req.setCharacterEncoding("UTF-8");
        chain.doFilter(req, res);
        res.setCharacterEncoding("UTF-8");
    }

    public void destroy() { }

    public void init(FilterConfig filterConfig) throws ServletException { }
}
于 2012-08-10T19:42:00.140 に答える