auの絵文字をUTF-8なフォームから送信すると-その2-

昨日の続き

UTF-8なフォームから「晴れ」絵文字を送信した時に送られたコード

機種名 送られてきたコード ブラウザバージョン
W61SA \xEE\x92\x88 6.2_7.2.7.1.K.1.5.1.119
W51P \xEE\xBD\xA0 6.2.0.11.1.4
CA002 \xEE\x92\x88 6.2_7.2.7.1.K.2.234

推測するに、KCP+端末は公式サイトのUnicode(をUTF-8エンコーディングしたもの)が送られる?

これって、周知の事実で私だけ知らなかったんだろうか?

ちょっとショック


【2011-04-01追記】
formタグに、accept-charset属性をつけていたのが原因でした。

<html>
<head>
<meta http-equiv="cache-control" content="max-age=0">
<title>Form</title>
</head>
<body>
<p>
<form action="**.cgi" method="post" accept-charset="UTF-8">
<input type="text" name="text" value="">
<input type="submit" value="送信">
</form>
</p>
</html>

↑こんな風に書くと、KCP+端末は「晴れ」絵文字を\xEE\x92\x88で送ってくる。

▼accept-charsetありで「晴れ」絵文字送信
機種名 送られてきたコード KCP+
W61SA \xEE\x92\x88
W51P \xEE\xBD\xA0 ×
▼accept-charsetなしで「晴れ」絵文字送信
機種名 送られてきたコード KCP+
W61SA \xEE\xBD\xA0
W51P \xEE\xBD\xA0 ×

普通はaccept-charset属性なんて付けませんからね。
驚かせてすみません。

でも、なんでKCP+端末はaccept-charset属性をつけると絵文字コードが変わるんだろう。
確か、KCP+端末でWMLフォームから送信する時、accept-charset属性が無いと2バイト文字が送信できなかった(この時はShift_JISだった)記憶があるけれども、それと関連するのかな?

そう言えばKCP+端末ってWML2.0に対応しているみたいなんですよね。

KCP+のブラウザって、htmlをwmlに変換して解釈しているのかな?
つまり、上にあるhtmlを、

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE wml PUBLIC "-//OPENWAVE.COM//DTD WML 1.3//EN" "http://www.openwave.com/dtd/wml13.dtd">
<wml>
<head>
<meta http-equiv="cache-control" content="max-age=0" forua="true"/>
</head>
<card title="Form">
<input type="text" name="text" value=""/>
<do type="button" label="送信">
<go href="**.cgi" method="post" accept-charset="UTF-8">
<postfield name="text" value="$(text)"/>
</go>
</do>
</card>
</wml>

のように解釈しているんじゃないかと。。。

しかし、そうだとしても『なぜKCP+端末はaccept-charset属性をつけると絵文字コードが変わるのか』の答えは得られない気がしますね。


<参考>
WML2.0の仕様書によると、accept-charsetは、wml:go要素の属性として以下のような働きをします。

The accept-charset attribute specifies the list of character encodings for data that the origin server must accept
when processing input. The value of this attribute is a comma- or space-separated list of character encoding names as
specified in [RFC2045] and [RFC2616].

If the accept-charset attribute is not specified or is the reserved string unknown, the user agent should use the
character encoding that was used to transmit the document that contains the wml:go element.

The user agent SHOULD transcode the field names and values to the correct character set, as specified explicitly
by the accept-charset or implicitly by the document encoding.