※ ChatGPTを利用し、要約された質問です(原文:携帯電話の絵文字とURLエンコード/デコードについて)
携帯電話の絵文字とURLエンコード/デコードについて
このQ&Aのポイント
携帯電話の絵文字とURLエンコード/デコードについて調査中の開発者です。
PHPとJavaの間でURLエンコードされたクエリー文字列を受け取り、URLデコードする際に携帯電話の絵文字が文字化けする問題について困っています。
通常の文字列に関しては問題なく処理できているので、絵文字の問題だけが残っています。解決策をご存じの方は教えてください。
携帯電話の絵文字とURLエンコード/デコードについて
携帯電話の絵文字とURLエンコード/デコードについて
Java・シェルスクリプトによるCGIとPHPを用いた
携帯電話向けのウェブアプリを開発しています。
アプリの内容としては、PHP側で生成したHTMLのフォームから
ユーザーに入力してもらった文字列を引数としてJava側に渡し、
Java側で値を受け取ってから、文字列変換処理を行うものです。
この際の、携帯電話特有の絵文字の取り扱いについてつまずいています。
PHPとPHPとの間の場合は、フォームから送られるパラメータが
絵文字を含んでいたとしても、特に何の問題なく絵文字パラメータの
入力・送信(<input type="text" name="hoge" value="EMOJI">)・
受信・表示(echo $_REQUEST['hoge']; で EMOJI を表示する)ができていたのですが、
フォームから送られるURLエンコードされたクエリー文字列を
Java側で引数として受け取り、もとの文字列に戻すためにURLデコードの処理をかけると、
携帯電話で入力した絵文字の部分だけ文字化けしてしまいます。
(現在確認の取れているのは、ドコモの絵文字とauの絵文字が「 ? 」
(半角のクエスチョンマーク)に化けてしまう事態です)
PHPどうしの間でフォームによってPOSTやGETで送受信される際も
入力された値がいったんURLエンコードされてから
HTTPリクエストに乗ることは間違いないと思うので、
Java側のURLデコーダーの問題かと思われるのですが
(たとえば、未知の範囲のバイナリはすべて例外として ? にしてしまう、など)、
どなたか解決策等をご存じないでしょうか。
ちなみに現状、絵文字以外の通常の文字列に関しては目立った問題はなく
受信、変換処理、表示等ができている段階なので、
最後の最後に絵文字の問題だけが残ってしまい、困っています。
よろしければ、ご教唆のほど、よろしくお願い申し上げます。
参考までに、開発環境は以下の通りです。
・Windows XP SP3 + Eclipse Build id: 20100218-1602(ローカル開発環境)
・Cent OS 5.3(アプリ実行用VPSサーバー)
・Sun JDK SE: 1.6.0_20
(開発用Windowsマシン・アプリ実行用サーバともに同じバージョン)
・使用言語および文字コード
Java、PHP、日本語、Shift_JIS(携帯電話のうち、ドコモがShift_JISを標準とするため)
・URLデコーダーに使っているパッケージ・クラス
org.apache.commons.codec.net.URLCodec の decode()メソッド
(Shift_JISの場合、java.net.URLDecoder は java.net.URLEncoderでエンコードしたものしか正常にデコードできないため)
(参考: http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25659&forum=12 )
( http://commons.apache.org/codec/download_codec.cgi )
お礼
ご返答ありがとうございます。 いろいろと実験してみましたところ、Java実行環境に“Shift_JIS”と明記して使用した場合、携帯電話の絵文字のみならず、よく知られている「機種依存文字」(丸囲みの数字など)も、「Javaの定義するところの」Shift_JISにおいて未定義の外字領域とみなされ、「?」に置き換えられてしまうことが分かりました。 ですので、未定義の外字領域を無視するShift_JISではなく、外字領域を有効とする、Shift_JISの拡張コードである“Windows-31J”を用い、 System.setProperty("file.encoding", "Windows-31J") とJava実行時の環境引数として -Dfile.encoding=Windows-31J を加えることで、String型のまま、絵文字や上記の機種依存文字の問題も解決いたしました。 文字コードに含まれないバイナリを「?」に変換しているのだろう、とのご教唆がヒントになりました。誠にありがとうございました。