JavaとJavaEEプログラマのブログ

JavaEEを中心にしたをソフトウェア開発についてのブログ

GAEでの文字化けへの対処まとめ。

例えば、他のWEBサービスから読み込んだデータが文字化けしていた時は

 <p><a href="http://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E4%B8%80%E3%81%AE%E7%BE%8E%E5%A5%B3%E3%81%AB%E3%81%AA%E3%82%8B%E3%83%80%E3%82%A4%E3%82%A8%E3%83%83%E3%83%88-%E3%82%A8%E3%83%AA%E3%82%AB-%E3%82%A2%E3%83%B3%E3%82%AE%E3%83%A3%E3%83%AB/dp/4344016645%3FSubscriptionId%3D1275QA2300T51K67HTR2%26tag%3Dgwaihirsprogr-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4344016645"><img src="http://ecx.images-amazon.com/images/I/414EEATQuzL._SL160_.jpg" width="110" height="160" alt="■■■■■■■????■■■???■■■■■■■■■■■■■■■■■???????■"></a></p>

このようにストリームを読み込む時に、文字コードを指定する必要がある。

        URL url = new URL(urlStr);
        connection = (HttpURLConnection) url.openConnection();

        connection.setRequestMethod("GET");
        inputStream = connection.getInputStream();

BufferedReader reader =
            new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

また、念のためレスポンスを書き込む時の文字コードも指定する。
jQueryと組み合わせる場合はhtmlファイルの文字コードとmetaタグでの文字コード指定も統一する。

 String encoding = request.getCharacterEncoding();
        if (encoding == null) {
            encoding = "UTF-8";
        }
        logger.info("encoding=[" + request.getCharacterEncoding() + "]");
        response.setCharacterEncoding(encoding);
        response.setContentType("text/html; charset=UTF-8");


        Writer writer = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), encoding));
        writer.write(mes);
        writer.flush();

        writer.close();

appengine-web.xmlにも使用する文字コードの指定を追加しておく。

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

使う文字コードは"UTF-8"のみ。
WIndows-31JやShift-JIS、EUC_JPなどは昔のシステムとの互換性のためだけに存在するので使わない。