読者です 読者をやめる 読者になる 読者になる

遥かへのスピードランナー

シリコンバレーでAndroidアプリの開発してます。コンピュータービジョン・3D・アルゴリズム界隈にもたまに出現します。

Firefox MobileSimulatorアドオンの絵文字の取り扱いについて

Firefox MobileSimulator IT Mobile

先日公開したFirefox MobileSimulatorアドオンを、MobileSimulator - Firefox更新情報 Wiki*で取り上げていただきました!
ありがとうございます。

アドオンの詳細について、自分が記載していない点についても、かなり補足で書いて頂いているのですが、
1点絵文字対応について、「SoftBankにのみ対応している」との記載があったので訂正させていただきました。

絵文字には"一応"3キャリアとも対応しています。
"一応"と書いているのは、キャリアによってその記載方法は数通りあり、
それら全ての記載方法に対応するのが現時点で難しかったので、
現行のVer0.0.2では、一部の書き方にのみ対応している、ということです。

Ver0.0.2で対応しているのは以下の書き方です。

  • DoCoMoのUnicode16進数値参照(例:)
  • DoCoMoのSJISバイナリ
  • SoftBankのWebコード(ESC $ + SJISコード + SI の記載方法)
  • Auの<img localsrc="iconno">方式

なぜ部分的にしか対応できなかったというのは、キャリアの絵文字記載方法と密接な関連があります。
それについて詳しく書いていきたいと思います。

各キャリアの絵文字記載方法について

各キャリアの絵文字記載方法については携帯の文字コードと絵文字の基礎知識に詳しいですが、ざっと記法とキャリアの対応状況についてまとめると以下のような感じになります。

記法DoCoMoAuSoftBank
SJISバイナリ
Unicode(UTF8)バイナリ
SJIS16進数値参照××
SJIS10進数値参照×
Unicode16進数値参照
Unicode10進数値参照×
Webコード(ESC $ + SJISコード + SI の記載方法)××
imgタグ方式××

黄色背景のセルは、先ほど書いたMobileSimulator Ver0.0.2で対応している部分です。
この他の白背景セルの記載方法にはまだ対応していません。
たとえば、DoCoMoとAuではSJISコードの10進数値文字参照(例:&#63647;)で絵文字が記載できますが、
現行のMobileSimulatorでは文字化けて表示されます。

なぜSJISの10進数値文字参照に対応できなかったのか

一言でいうとSJISの10進数値参照なのか、Unicodeの10進数値参照なのかをアドオン側で識別できなかったからです。

今例にあげた「SJISの10進数値文字参照」による文字表記はPCの世界では一般的な書き方ではありません。
通常、FirefoxなどのPCブラウザは、数値参照はUnicode文字コードが記載されるものとして解釈するからです。

MobileSimulatorアドオンでは、windowオブジェクトのloadイベントが発生したタイミングでinnerHTMLを取得して、その中の絵文字をimgタグに置換し、表示しています。
しかしSJISの10進数値参照「&#63647;」の文字列をinnerHTML等DOM経由でアドオンに渡そうとすると、アドオンには数値参照の文字列ではなく、Unicodeとして解釈された後の文字が引き渡されます。
つまり、63647の文字コードは、携帯端末だとSJISとして解釈するところを、アドオンではUnicode文字コードと誤認してしまうわけです。

アドオン側では文字は全てUnicodeとして解釈される為、渡ってきた文字がバイナリで書かれていたものなのか、数値参照で書かれていたものなのかを知る術が有りません。
つまり、Unicodeの63647なのかSJISの63647なのかは分からない。
これが、一部の記載方法にしか対応できなかった理由です。

どうすればSJISの10進数値文字参照に対応できるのか

上記はあくまでDOM経由でのテキスト受け渡しに限った話で、
なんらかの方法で、数値参照が展開される前のプレーンな文字列をアドオン側で取得できれば
対応はできると考えています。

これについてのヒントは
mozilla.dev.tech.network|Googleグループ
に詳細な情報がありました。

ざっくりいうと、アドオンがhttp-on-examine-responseイベントが発生したタイミング(httpリクエストがブラウザで解析される前)で、Webサーバーから取得したchannelのcontent-typeをブラウザが解釈できないタイプXに変更する。そして、そのタイプXから元のcontent-typeに変換するstream converterを予め作成し、登録しておいてあげると、stream converterの中で数値参照が解析される前のテキストを操作できる、という流れです。

結構面倒なのですが、ブラウザが解析する前の生のテキストをアドオンで操作するためにはこれくらいしか方法がなさそうです。
これ以外の方法があれば、コメントやトラックバックでぜひ教えてください><