久しぶりにJavaしている今日この頃です(9) 絵文字とかガラパゴスなものはさっさと消えてくれないかな〜
iPhone欲しいよね〜、っというわけで、今週は絵文字対応のライブラリを作っていたわけですが(・ω・)
週後半は別タスクを入れられてしまったので、めずらしく残業もしてみたりして(#゚Д゚)
あと、あまり複雑なテストはしていないので、それは人にお願いする予定(・∀・)ノシ*1
で、仕様としてはこんなところにしてみたわけですが(・ω・)
- DoCoMo、au、SoftbankのShift-JIS及びUTF-8に対応
- 入力から絵文字の削除
- 入力から絵文字をUnicodeの私的領域へのマッピング
- Unicodeの私的領域から端末に応じた絵文字へのマッピングして出力
- PCへの出力は画像で
MobilePictogramConverterやEmf(Servlet絵文字フィルター)で出来ることを参考にして。
要するに、Unicodeの私的領域を使ってシームレスに絵文字と扱うのと、キャリア間の相互変換を実装したかったと言うことですにょ(・ω・)
私的領域へのマッピングは、DoCoMoとSoftbankは仕様通りで、auに関してはいわゆる裏Unicode領域を使って衝突しないように作成。
まあ、各キャリアのShift-JIS、UTF-8、Unicode変換テーブルとキャリア間の相互変換テーブルは外出しのファイルなので、そこを弄れば良いだけなんですが。
結局、このテーブル変換が主な処理なので、絵文字基本クラスでほとんどの処理を実装。
Concreteな各キャリア絵文字クラスでは、Unicodeも文字参照を作ったり、<img localsrc/>を吐いたりするだけのものになりまスタ。*2
で、今回一番はまったのは、入力パラメータを取得する際の文字コードの問題だったりして(´・ω・`)
普通にJavaでWebアプリを作る時は、HttpServletRequest.setCharacterEncoding()で使う文字コードを指定しておけば良いわけですが。
今回は、出力するHTMLをPCとSoftbankはUTF-8、DoCoMoとauはShift-JIS(Windows-31J)とか、キャリア毎に文字コードを変えて、混在できるようにしようとしたらちょっと面倒な事に(´・ω・`)
結局、最初に仮でsetCharacterEncoding("ISO-8859-1")しておいて、HttpServletRequestWrapper派生のgetParameterValues()の所でnew String(org.getBytes("ISO-8859-1"), encoding)することで対応してみたわけですが。*3
で、今回はJava用に適当な絵文字処理ライブラリが見つからなかったので、自前で用意してみたわけですが。
携帯サイトの作成なんかはやっぱり、PHPやPerlが主流ってことですかね(・ω・)?