web エンコーディングをShift-JISにしたフォームの文字化け

735 views
Skip to first unread message

akiyama masahiro

unread,
Jan 14, 2012, 8:47:23 AM1/14/12
to 日本Playframeworkユーザー会
はじめまして、秋山と申します。


Play.1.2.4 を使って、モバイルサイトの構築を試みています。
レンダリングされるHTMLをShift-JISにするために、 application.conf へ下の定義を追加しました。
application.web_encoding=Shift-JIS

form からpostした値を確認すると文字化けしています。
「あいうえお」や「漢字」は化けていませんが、「記号」や「①」は文字化けしていました。


http://playdocja.appspot.com/documentation/1.2.3/controllers#encoding
を参考に form タグのaccept-charset 属性と、hiddenタグで _charset_ を
指定する方法を試しましたが、駄目でした。


なにか、妙案をお持ちの方がいらっしゃいましたら、おしえていただけませんか。

Kitora, Naoki

unread,
Jan 15, 2012, 5:24:49 AM1/15/12
to pla...@googlegroups.com
秋山さん

初めまして、木虎と申します。

> Play.1.2.4 を使って、モバイルサイトの構築を試みています。
> レンダリングされるHTMLをShift-JISにするために、 application.conf へ下の定義を追加しました。
> application.web_encoding=Shift-JIS
>
> form からpostした値を確認すると文字化けしています。
> 「あいうえお」や「漢字」は化けていませんが、「記号」や「①」は文字化けしていました。
>
>
> http://playdocja.appspot.com/documentation/1.2.3/controllers#encoding
> を参考に form タグのaccept-charset 属性と、hiddenタグで _charset_ を
> 指定する方法を試しましたが、駄目でした。

試していないのでわかりませんが、"Shift-JIS" ではなく "Shift_JIS" と指定してもダメでしょうか?
"Shift-JIS" は正確な表記ではないため、とりあえず気になった次第です。
http://ja.wikipedia.org/wiki/Shift_JIS

① は NEC 特殊文字なので "Windows-31J" (こちらはハイフンです) と指定しないといけないかもしれません。
http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932

# "EUC-JP" は "-" (ハイフン) なんですけどね。

--
Kitora, Naoki <naoki....@gmail.com>
twitter: http://twitter.com/kitora_naoki

akiyama masahiro

unread,
Jan 15, 2012, 11:24:17 AM1/15/12
to 日本Playframeworkユーザー会
木虎さん

返信ありがとうございます。秋山です。

エンコードを"Shift_JIS"にしてみましたが、駄目でした。
「記号」と「①」のいずれも文字化けしてします。

エンコードにMS932を試してみると、「①」は大丈夫でしたが、
「記号」の文字化けは直りませんでした。


バージョン1.2.4をデバッガで追いかけてみると、

play.data.parsing.UrlEncodedParser#parse(InputStream)の
115: Utils.Maps.mergeValueInMap(decodedParams, key, (value == null ?
null : URLDecoder.decode(value, charset)));
にある、
URLDecoder.decode(value, charset)
が直接の原因のようです。

「URLDecoder.decode」でググってみると、iso-8859-1でバイト配列にしてから、変換するとよいようです。
http://www.google.co.jp/search?q=URLDecoder.decode+%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox


URLDecoder.decodeの部分を変更して、ビルドしてみます。

以上

On 1月15日, 午後7:24, "Kitora, Naoki" <naoki.kit...@gmail.com> wrote:
> 秋山さん
>
> 初めまして、木虎と申します。
>
> > Play.1.2.4 を使って、モバイルサイトの構築を試みています。
> > レンダリングされるHTMLをShift-JISにするために、 application.conf へ下の定義を追加しました。
> > application.web_encoding=Shift-JIS
>
> > form からpostした値を確認すると文字化けしています。
> > 「あいうえお」や「漢字」は化けていませんが、「記号」や「①」は文字化けしていました。
>
> >http://playdocja.appspot.com/documentation/1.2.3/controllers#encoding
> > を参考に form タグのaccept-charset 属性と、hiddenタグで _charset_ を
> > 指定する方法を試しましたが、駄目でした。
>
> 試していないのでわかりませんが、"Shift-JIS" ではなく "Shift_JIS" と指定してもダメでしょうか?
> "Shift-JIS" は正確な表記ではないため、とりあえず気になった次第です。http://ja.wikipedia.org/wiki/Shift_JIS
>
> ① は NEC 特殊文字なので "Windows-31J" (こちらはハイフンです) と指定しないといけないかもしれません。http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%...
>
> # "EUC-JP" は "-" (ハイフン) なんですけどね。
>
> --
> Kitora, Naoki <naoki.kit...@gmail.com>
> twitter:http://twitter.com/kitora_naoki

akiyama masahiro

unread,
Jan 16, 2012, 7:37:04 AM1/16/12
to 日本Playframeworkユーザー会
木虎さん

秋山です。

UrlEncodedParser を変更してみると、文字化けしないようになりました。
「①」の記号はエンコードに"Windows-31J"か"MS932"を指定することで、文字化けしませんでした。

今回は、解決のヒントを与えていただき、助かりました。

最後に、UrlEncodedParser の変更内容は下のものです。

diff --git a/framework/src/play/data/parsing/UrlEncodedParser.java b/
framework/src/play/data/parsing/UrlEncodedParser.java
index 6f5765f..808df2f 100644
--- a/framework/src/play/data/parsing/UrlEncodedParser.java
+++ b/framework/src/play/data/parsing/UrlEncodedParser.java
@@ -112,7 +112,7 @@ public class UrlEncodedParser extends DataParser {
}
for (String value : e.getValue()) {
try {
- Utils.Maps.mergeValueInMap(decodedParams,
key, (value == null ? null : URLDecoder.decode(value, charset)));
+ Utils.Maps.mergeValueInMap(decodedParams,
key, (value == null ? null : new String(URLDecoder.decode(value,
"iso-8859-1").getBytes("iso-8859-1"), charset)));
} catch (Throwable z) {
// Nothing we can do about, lets fill in with
the non decoded value
Utils.Maps.mergeValueInMap(decodedParams,
key, value);

以上

On 1月16日, 午前1:24, akiyama masahiro <akiyama.masah...@gmail.com> wrote:
> 木虎さん
>
> 返信ありがとうございます。秋山です。
>
> エンコードを"Shift_JIS"にしてみましたが、駄目でした。
> 「記号」と「①」のいずれも文字化けしてします。
>
> エンコードにMS932を試してみると、「①」は大丈夫でしたが、
> 「記号」の文字化けは直りませんでした。
>
> バージョン1.2.4をデバッガで追いかけてみると、
>
> play.data.parsing.UrlEncodedParser#parse(InputStream)の
> 115: Utils.Maps.mergeValueInMap(decodedParams, key, (value == null ?
> null : URLDecoder.decode(value, charset)));
> にある、
> URLDecoder.decode(value, charset)
> が直接の原因のようです。
>
> 「URLDecoder.decode」でググってみると、iso-8859-1でバイト配列にしてから、変換するとよいようです。http://www.google.co.jp/search?q=URLDecoder.decode+%E6%96%87%E5%AD%97...

Kitora, Naoki

unread,
Jan 16, 2012, 5:38:40 PM1/16/12
to pla...@googlegroups.com
秋山さん

木虎です。

> UrlEncodedParser を変更してみると、文字化けしないようになりました。
> 「①」の記号はエンコードに"Windows-31J"か"MS932"を指定することで、文字化けしませんでした。

解決したようで良かったです。

UrlEncodedParser の変更箇所の共有もありがとうございます。勉強になりました。

Reply all
Reply to author
Forward
0 new messages