.net1.1+aspのモバイルページでAUの携帯からWMLフォームからの全角文字列が文字化け

死ぬほどハマってやっと原因らしき情報にあたった。

Re: 絵文字対応BBSで書き込め・.. 投稿者:Kimura 投稿日:2008/04/28(Mon) 20:13 No.1823

以下の原因がわかりました。

> 絵文字対応BBSも書き込めなくなっています。
> 具体的には、フォーム入力後、投稿プレビュー画面で全角文字がすべて、半角のクエスチョン「?」等に文字化けしてしまうようです。
> そのため、送信をしても「メッセージに全角文字がない のため投稿を中止しました」のエラーメッセージが出てしまい、投稿できなくなってしまいます。

KCP+端末では、WMLの仕様が変わったようです。
WMLフォームから送られた文字セットがUTF-8でないと、2バイト文字を受け付けないのです。
(当たり前ですが、HTMLでは起こりません)

絵文字対応BBSでは、au向けにWMLという言語で画面表示を行っており、WMLフォーム(=投稿フォーム)の文字コードは、Shift_JISなので、この問題に見事マッチ(?)してしまいます。

今時、WMLを使っているのが悪いのですが、なんだかVodafone3Gの時を思い出します。げんなり。

HTMLに書き直すか、このままWMLで突っ走るか考え中です。

ことの発端

今請け負ってる仕事が2000年頃.net1.1+asp+vb.netで作られたページのリニューアルで、サーバーの関係上.net2以降にバージョンアップできない。
仕方ないのでもとのソースを変更してたんだけど、携帯用ページの投稿フォームからAUの携帯から登録した時に限って文字化けしてた。

さくっと調べた感じでは*1web.configのglobalizationに

   <globalization 
       culture="ja-JP" 
       requestEncoding="shift_jis" 
       responseEncoding="shift_jis" 
       fileEncoding="shift_jis" 
       enableBestFitResponseEncoding="false"/>

みたいな感じで書けば治るってあったので適用してみるも変化なし。

KDDIの技術ページではShiftJISでやり取りしないと文字化けする的な記述*2になってたので各所にCharsetを設定してみるも全く改善せず。

埒があかないのでパケットモニタでスニッフ

WindowsServer2003のネットワークモニタをインストール*3してHTTPデータを拾ってみる。

Request(携帯→IIS)
GET /hoge/(juz0qe451vcnae55ebrizzy5)/iMobile/LoginCS.aspx?__redir=1 HTTP/1.1
Host: test.server
x-up-devcap-cc: 1
User-Agent: KDDI-CA3B UP.Browser/6.2_7.2.7.1.K.2.231 (GUI) MMP/2.0
Accept-Charset: shift_jis,*
Accept-Language: ja-jp
x-up-devcap-iscolor: 1
x-up-devcap-max-pdu: 131072
x-up-devcap-multimedia: A300961224402120
x-up-devcap-qvga: 1
x-up-devcap-numsoftkeys: 2
x-up-devcap-screenchars: 23,15
x-up-devcap-screendepth: 16,RGB565
x-up-devcap-screenpixels: 240,348
x-up-devcap-softkeysize: 6
x-up-devcap-titlebar: 0
Accept: image/bci, application/x-kmcs-form-data, application/x-www-form-urlencoded, application/x-kddi-playlist, application/x-tar, application/vnd.KDDI-vpimlist, application/vnd.KDDI-setsynctime, application/vnd.KDDI-verror, application/vnd.syncml+wbxml, application/x-kddi-drm, text/x-vmessage, text/x-vcard, text/x-vcalendar, text/calendar, text/vcard, application/x-kddi-htmlmail, application/x-kddi-ezmusic, application/x-kddi-karrange, application/x-kcf-license, application/x-kddi-kcf, text/vnd.sun.j2me.app-descriptor, text/x-vnote, application/x-kddi-mcx, application/x-kddi-auc, application/x-kddi-video, application/widget, application/x-atokdic, application/octet-stream, application/vnd.phonecom.mmc-wbxml, application/vnd.phonecom.mmc-xml, application/vnd.wap.wmlc;type=4365, application/vnd.wap.xhtml+xml, application/xhtml+xml;profile="http://www.(略)

Accept-Charsetがshift_jis,*ワイルドカード表記になってるのが少し気になるけどそれ以外は変なとこなし。

Response(IIS→携帯:問題のFormを含む)
Date: Wed, 13 Jan 2010 09:28:35 GMT
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
X-AspNet-Version: 1.1.4322
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: text/vnd.wap.wml; charset=shift_jis
Content-Length: 3152

<?xml version='1.0' encoding ='shift_jis'?>
<!DOCTYPE wml PUBLIC '-//WAPFORUM//DTD WML 1.1//EN' 'http://www.wapforum.org/DTD/wml_1.1.xml'><wml><head>
<meta http-equiv="Cache-Control" content="max-age=0" />
</head>
<card>
<onevent type="onenterforward"><refresh><setvar name="txtPron" value="てすと" /><setvar name="txtCusName" value="テスト" /><setvar name="txtPWD" value="123456" /><setvar name="txtPostal" value="0700083" /><setvar name="cbxPref" value="1" /><setvar name="txtAddr1" value="旭川市" /><setvar name="txtAddr2" value="" /><setvar name="txtPhone1" value="09000000000" /><setvar name="txtPhone2" value="0166000000" /><setvar name="txtFax" value="0123456789" /><setvar name="txtEMAIL" value="hoge@test.com" /></refresh></onevent>
<do type="accept" label="登録"><go href="/hoge/(juz0qe451vcnae55ebrizzy5)/iMobile/Register.aspx" method="post"><postfield name="__VIEWSTATE" value="aDxfX1A7QDw75K6I46eu57O74KONLDA7Pjs+2Z72Q9Ejna5z2bkOrKESTav0jQ0=" /><postfield name="__EVENTTARGET" value="btnRegist" /><postfield name="txtPron" value="$(txtPron)" />
(略)

Contents-Typeにしっかりshift_jisと入ってるし、日本語もちゃんとshift_jisエンコードされているようで全く問題ない。
(未だにwmlかよってのはあるにせよ。)

Request(携帯→IIS:ここで送られるデータが化ける)
POST /hoge/(juz0qe451vcnae55ebrizzy5)/iMobile/Register.aspx HTTP/1.1
Host: test.server
x-up-devcap-cc: 1
User-Agent: KDDI-CA3B UP.Browser/6.2_7.2.7.1.K.2.231 (GUI) MMP/2.0
Accept-Charset: shift_jis,*
Accept-Language: ja-jp
x-up-devcap-iscolor: 1
x-up-devcap-max-pdu: 131072
x-up-devcap-multimedia: A300961224402120
x-up-devcap-qvga: 1
x-up-devcap-numsoftkeys: 2
x-up-devcap-screenchars: 23,15
x-up-devcap-screendepth: 16,RGB565
x-up-devcap-screenpixels: 240,348
x-up-devcap-softkeysize: 6
x-up-devcap-titlebar: 0
Accept: image/bci, application/x-kmcs-form-data, application/x-www-form-urlencoded, application/x-kddi-playlist, application/x-tar, application/vnd.KDDI-vpimlist, application/vnd.KDDI-setsynctime, application/vnd.KDDI-verror, application/vnd.syncml+wbxml, application/x-kddi-drm, text/x-vmessage, text/x-vcard, text/x-vcalendar, text/calendar, text/vcard, application/x-kddi-htmlmail, application/x-kddi-ezmusic, application/x-kddi-karrange, application/x-kcf-license, application/x-kddi-kcf, text/vnd.sun.j2me.app-descriptor, text/x-vnote, application/x-kddi-mcx, application/x-kddi-auc, application/x-kddi-video, application/widget, application/x-atokdic, application/octet-stream, application/vnd.phonecom.mmc-wbxml, application/vnd.phonecom.mmc-xml, application/vnd.wap.wmlc;type=4365, application/vnd.wap.xhtml+xml, application/xhtml+xml;profile="http://www.wapforum
(略)
x-up-subno: 07051060444335_ad.ezweb.ne.jp
Content-Type: application/x-www-form-urlencoded;charset=Shift_JIS
Via: 1.1 wb43proxy07.ezweb.ne.jp
Connection: close
Content-Length: 361

__VIEWSTATE=aDxfX1A7QDw75K6I46eu57O74KONLDA7Pjs%2B2Z72Q9Ejna5z2bkOrKESTav0jQ0%3D&__EVENTTARGET=btnRegist&txtPron=%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F&txtCusName=%3F%3F%3F%3F%3F%3F%3F&txtPWD=123456&txtPostal=0700083&cbxPref=1&txtAddr1=%3F%3F%3F%3F%3FT%3Fg3-2&txtAddr2=&txtPhone1=09000000000&txtPhone2=0166000000&txtFax=0123456789&txtEMAIL=hoge%40test.com

txtPron=%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F
txtAddr1=%3F%3F%3F%3F%3FT%3Fg3-2

あばばばばばば

どうやらサーバー側の話じゃないらしい

IISに届いたパケットがすでにtxtAddr1=?????T?g3-2と成っているところをみると携帯側でフォームデータをエンコードする段階で誤った文字コードエンコードしてるのが原因らしい。

入力したデータと送信されてきたデータから文字化け判定表*4にかけてみたところ、UTF-8をShiftJISとしてエンコードしているようだ。

ちなみにOpenwaveSDK6.2Kで試した場合文字化けせずにちゃんと送信されているので特定の携帯のバグかと思ったら、社内にあるAUの携帯全部で文字化けが起こってた。
実にFuckだ。

で、冒頭の情報にぶちあたったわけで

実にFuckだ。

さてどうする。

IISから送出されてるデータを見る限り、KCP+端末にはDocomo用のxhtmlを送ればいけそうな感じ。
DeviceCapあたりを弄ればなんとかなるかなと思案中。

あと

下位互換放り投げて勝手に仕様変更するKDDIは滅びるといいよ。