ホーム > FEP | Nokia | S60 2nd | S60 3rd | S60 5th | Symbian | 開発 > SDKドキュメントから見るS60と絵文字の関係

SDKドキュメントから見るS60と絵文字の関係

このBlogを見に来られる方々であればご存知だと思いますが、ここで言及する「絵文字」とは日本が誇る「ケータイの絵文字機能」のことです。当然、海外端末にはそんな機能は搭載されていないので、これらのユーザー層から見ればそのニーズは局所的ではあります。しかし、それでも絵文字を必要とする当事者にとってみれば周囲とのコミュニケーション維持に大きく影響する死活問題だったりもします(ほんとですよ?)。

なおこの問題に関してはずいぶん昔から多くの先駆者によって調べ尽くしされておりますので、ほとんど解は出つくした状態だったりします。ですが最近ちらほらと周囲から絵文字関係の話が持ち上がっており、興味が出てきたもののほぼノータッチな状態でしたので自分でもまとめてようかと思った次第です。しかし、ただまとめるだけでは面白くないので、SDKドキュメントにある記載を交えながら自分なりの推測も混ぜてみました(^^;。

以下で言及する端末は海外で販売されているSymbian OS端末(おもにNokia S60 2nd/3rd/5th)がメインです。あしからず~。ちなみにやや駆け足でまとめたために間違いがあるかもしれませんので、なにかありましたらご指摘いただけると助かります。


※今回は長文のため閉じておきます。あと、字ばっかりですみません;;気が向いたら絵も挿し込むかもしれません。

データとしての絵文字の仕組みは単純で、Unicode上において「0xe000~0xf8ff」に割り振られている「私用領域(外字領域)」に各図柄を割り振っているだけです(参考)。ただしこれには「同じ(ような)図柄に対して各キャリアで割り振っているコードが違う」という重大な問題(というか欠陥)があります(参考)。とはいえ、最近ではキャリアが違ってもケータイ同士で通信(メール)している分にはサーバー側で自動的に変換してくれるので問題はありません。しかし当然ながらそれ以外の端末(海外端末やPCなど)で見ると文字化け(いわゆるトーフやゲタ)を起こしてしまいます。(ただし単純にUnicodeで扱えるというのはプログラム側にとってはありがたいことです。



それで実際にSymbian OS端末上で絵文字を画面上に表示させようとした場合には3つほど方法があります。

一つは単純に「フォントに絵文字の図柄を埋め込んでしまう方法」です。

フォントはカラー情報を持っていないのでモノクロになってしまうものの、普通の文字と同じように出力できるので一番手軽です。少々値が張りますがフォントエディターもいくつか存在しますのでこれらを使えば自分で埋め込むことも可能です。ただ、加工の際はどうしても著作権の問題が出てきますので加工や二次配布の際には注意が必要です<とは言っても大抵のフォントには改変不可を示すロックが掛かっているので加工できるフォント自体が稀だったりします。


二つ目は「アプリケーション上で強引に上書きする方法」です。

これはアプリケーションの内部で独自に絵文字の表示機能を持たせてしまう方法です。例えば海外で割りと需要がある、送られてきたSMSに「:)」といったスマイリーが含まれていると絵文字に置き換えるようなアプリケーションです。この場合は絵文字の表示はアプリケーション内に限定され汎用性は下がってしまいますが、その分柔軟に対応することが可能になります。とはいえ絵文字はほとんどメールで使用されるものですので、絵文字対応なメーラーを作ってしまうというのも充分ありだと思います。


三つ目は「プログラムから該当文字に対して絵文字のビットマップ(画像)を張る方法」です。(一応今回のエントリのメインの話)

なぜか「S60」((残念ながら該当APIはS60独自のものであって、Symbian OS標準機能ではないです。そのためUIQで利用することもできません。)) のライブラリには絵文字を表示するための機能・クラスが用意されています。クラスに関しては「S60 3rd MR」1のSDKドキュメント「Pictograph API」の項に記載されています2

この項を見ますとどうやら「Series60 2nd Ed FP2(2.6)」の頃に実装されたようです3。また「Constraints:The Pictograph feature is not enabled in Japanese SDK emulator environment because the actual pictograph bitmaps need to be licensed from operators separately. Therefore, pictograph rendering can be verified only in hardware.」という文章も記載されていますので、時期的に見て「Vodafone 702NK」の時にわざわざ実装されたものではないかという推測が立ちます。(この文章は後でもキーになりますので覚えておきましょう(謎))

ちなみにこの機能は、テキストエディタ等、文字入力が必要なシーケンスにおいて該当する文字コードが現れたら用意されたビットマップ画像で上から張るといった単純ものです。しかし、単純かつOSの近い位置4で実装されているためにアプリケーションが意識することなく絵文字を表示させることができます(しかもアニメーション絵文字にも対応!)。余談になりますがこの対応方法を見てもNokiaは日本市場に割りと本気だったのではないかということが推測できます5

プログラム的な話になってしまいますが、この自動的に絵文字を表示する機能はグラフィック系のAPI「DrawText」には効きません。しかし、グラフィック用には別途「MAknPictographDrawer」というクラスが用意されていますので、そちらを利用することで「DrawText」でテキストを扱うのと同じように絵文字を扱うことが可能になります。もし興味のある方はサンプルコードが「Pictograph API – Technical Specification」に載っていますのでそちらを参照して下さい。エミュレータ上で実際に試してみましたが(条件がそろっていれば)案外あっさり使えました。


…と、絵文字ユーザーにしてみれば垂涎ものの機能ではありますが、この機能は「日本のキャリアから販売されたNokia端末と日本語対応されている一部のS60 SDK上でしか機能しない」という大きな落とし穴があります (以降の話は先人の方々の調査結果とSDKの内容を照らし合わせたものです)。6

話はより具体的になりますが、某氏らが公開された資料によりますとこの機能が有効になるには「AknPictograph.dll」と「AknPictographImpl.dll7」と「絵文字の画像ファイル(*.mbm)」が必要になり、絵文字が有効な端末ではこれらがそろっているそうです。

「S60 3rd MR」のSDKを日本語化8のインストールフォルダを検索すると同じものが見つけることができました9。そして、実際に絵文字の文字コードを含んだテキストファイルを表示させたり、FEPから直接該当文字コードを出力すると表示できます。

で、絵文字に対応していない端末にはこれらのファイルがいないかと思いきや、「AknPictograph.dll」だけは存在しているようです。

ここで気になるのは各の関係ですが、「AknPictographImpl.dll」が「絵文字の画像ファイル」の読み取りを行い、「AknPictograph.dll」がそれらを呼び出している、また「AknPictograph.dll」は他のファイルがいないと機能しない(スルーする)という噂です。


これはSDKドキュメントを読みますとだいたい合っている事が推測できます。

まず、「AknPictograph.dll」が非対応端末にもいるというのは「Pictograph API」としてS60(2nd/3rd/5th10)のフレームワークに組み込まれてしまっているから外せないのではないかと思われます。根拠は実際にこれらのAPIを利用するための「CAknPictographInterface」「MAknPictographAnimatorCallBack」「MAknPictographDrawer」という3つのクラスが定義されているからです。

次に「Pictograph API – Technical Specification」の一番下にある「The main implementation resides in the polymorphic DLL AknPictographImpl.DLL.」という一文です。というかこれがほぼ全てを物語っていると思います。

「Pictograph API」上でどのように絵文字を表示されるかという話になりますが、まず絵文字の表示に必要な情報は「絵文字のための画像ファイル」と「キーコードの対応情報」です。そして画像ファイルはメモリにロードします。そして文字をアウトプットするタイミングでフレームワークが呼び出され、「1:該当する文字コードかチェック」し、「2:該当したら位置を割り出して画像を張る」という操作が行われます。

この中で「画像ファイルの指定」と「キーコードの対応情報」を指定する操作は前述の3つのクラスには含まれていません。「主要な実装はAknPictographImpl.DLLにある」という一文からしてもこれらの操作は「AknPictographImpl.dll」が持っていると見て間違いないでしょう。

もう一つ重要なのが「the polymorphic DLL」という単語です。

Symbian OSには「Polymorphic Interface DLL(多相DLL)」という仕組みがあります(他であるかはしりません;)。詳細はSDKドキュメント11やSymbian本12に譲りますが、平たく言うと「必要なときに呼び出される動的なDLL」です。これはコード上から呼び出されるので、存在しなければ無視するといったことも可能です。またFEPやCharConvなどのEComプラグインとはまた少々違いますがこれも差し替えることができます。


つまり、なぜこれらが分離されているのかといいますと、各キャリアで絵文字の文字コードマップが違うことを見越した上で、その差異を埋めるためにこのような実装になったのだと推測できます。おそらくE71が日本の両キャリアから販売されていたらそれぞれで異なった「AknPictographImpl.dll」と「絵文字の画像ファイル」が含まれていたと思われます。

また、フレームワークを削ることなく、非対応端末で機能を殺すことにもこのことが都合よく働いているのだと思われます(どちらが先かは判りませんが…)。



で、ここからが本題で(笑)、更に一歩踏み込むと「AknPictographImpl.dllは作れるのではないか」と推測できます。

前述したように具体的な仕様は公開されていないものの、その名前と機能はSDKドキュメントに明記されていますので、完全にブラックボックスな話ではないと思います。また「licensed」という言葉も、各キャリアが作ったDLLと画像ファイルに対して示しているものであり、絵文字の仕様から独自で作るのは問題ないはずです。

コンパイルに関しても「Polymorphic Interface DLL」の仕様にあわせて作ればアウトラインは問題ないと思います<ちなみに必要なケイパビリティは「All-TCB」…。

また、現にSMB版の「AknPictographImpl.dll」が存在するので(SMBとかじゃなくてDLL自体の)仕様13がNokiaのどこかに存在するはずです。これさえあれば作れるのではないかと思っているのですが、どこに問い合わせれば良いのか判りません(笑)。まずはForum Nokiaかなぁとは思うのですが、それもちょっと違うような気もしますし…。

ということで何か判りましたら情報お待ちしておりますm(_ _)m



あ、最後に余談ですが、「絵文字変換機能内で各キャリアに合わせた自動変換は~?」とかよく言われるのですが無理です(きっぱり)。理由はPolymorphic APIの段階ではキャリアの情報がないからです14。「AknPictographImpl.dll」に設定を持たせて外部から切り替えさせるといったことは可能だと思いますが。でもメールの話ですのでメーラーつくるなり変換サーバー立てるなりして行うのが正しいやり方だと思います(^^;


  1. 5thを含め他のバージョンのSDKでは情報が削られていたりしますので注意。 []
  2. 具体的なクラス名は「CAknPictographInterface」「MAknPictographAnimatorCallBack」「MAknPictographDrawer」の3つ。 []
  3. 各クラスや「Pictograph API – Purpose」の項を参照。 []
  4. EComプラグインではなく、もっとOSに近い部分のようです。 []
  5. と、たまにはフォローしてみたり(ぉ []
  6. とはいえ、このことは前述の「 Therefore, pictograph rendering can be verified only in hardware.」という一文から納得がいく流れではあります。 []
  7. ちなみに与えられているケイパビリティは「All-TCB」 []
  8. インストール後、「スタート メニュー→プログラム→S60 Developer Tools→3rd Edition SDK→1.1 MR→Languages→Change to Japanese」で変更できます。他の言語モードではだめです。 []
  9. ちなみにこれはWindows用にコンパイルされたものなので仮に端末にインストールできたとしても使えません。 []
  10. 5thのSDKにも同項はあります。…少し情報が削られていますが。 []
  11. 「Symbian OS v9.1 ≫ Symbian OS guide ≫ Base ≫ Using User Library (E32) ≫ Dynamically Loading Link Libraries」を参照 []
  12. Symbian OS C++ プログラミング 第2版のP649。 []
  13. 必要なのはクラス名とか関数名、あとは定義ファイル(*.def)とかかな? []
  14. じゃあFEPは~?とかCharConvは~?とか言わないように。同じ理由です(笑) []
Pocket

コメント:12

コザック 2009/5/23 土曜日

まとめ、おつです。
絵文字にみるノキアの日本進出と撤退の歴史ですね(ちょっと違うか)。

TMX@お茶の水 2009/5/23 土曜日

絵文字を送る相手がいない自分はどうすれば良いでしょうか? ^^;;;

レオナパパ 2009/5/24 日曜日

まとめご苦労様です。
おぉぉ、王子の考えておられることがやっと理解できました。
AknPictographInpl.dllを作ることができれば、アングラではなく、表舞台に引っ張り出せるかも知れないということですね。

で、懸念事項が2つありましたので確認してみました。
(1)AknPictographInpl.dllはz:\sys\bin\で指定されている。
AknPictograph.dllはAknPictographInpl.dllをドライブ指定付で呼び出していて、c:ドライブにインストールしても呼び出せるのか?という懸念です。
ドライブ指定を書き換えていたpatchを外して確認しました。結果は問題なく呼び出せました。これは杞憂に終わりました。
(2)AknPictographInpl.dllをアクティブにすることは可能なのか?
現在、条件分岐を殺すpatchにてアクティブに出来ることは確認していますが、この条件はFEATMGR.DLL(Feature Manager?)から得られています。このFEATMGR.DLLを十分に解析しきれていませんが、FEATMGR.DLL自体は機種によって差はないと思われます。
AknPictographInpl.dllの有無情報をどこから得ているかがよく解りません。CentralRepositoryは参照していないので、設定変更できるものなのかが心配です。
恐らくStaticFeatures.dllが機種毎の特徴データを持っているのではないかと想像していますが、中身はまったく解っていません。
これは懸念事項として残ります。

肝心のAknPictographInpl.dll自体も未だよく解析できていません。絵文字領域のUnicodeデータ等ハンドリング用データの塊であることは確認していますが、それ以上のことはさっぱりです。
もう少し調べてみようと思います。
何か解ればご連絡させていただきます。

ま~ 2009/5/24 日曜日

>コザックさんへ
ありがとうございます。
絵文字の標準化なんて話もありますので、もし実現するようでしたらこのAPIもまた日の目を見るのではないかと思っています(^^;。


>TMXさんへ
えーと…Toのフィードに自分のアドレスを書くというのはいかがでしょうか?(ぉぃ


>レオナパパさんへ
そうですね、やっぱりみんなが幸せになれる方法が一番ですので(^^)/

あとご指摘ありがとうございます。
なるほど、ドライブ指定されていることは見逃していました;;
DLLとかフォンとはYドライブ(?)→Cドライブ→Zドライブに探しにいくといった変なクセがあるのですが、直接指定だと難しいです。
Z決め打ちでは3rdパーティーでは手が出せませんのでその辺がキャリアによるという所以なのかもしれませんね;

あと他にも関連しているDLL類がいるんですね(^^;
これらもエミュレベルで調べれるものがあればこちらでも見てみたいと思います。

レオナパパ 2009/5/24 日曜日

クラスの理解はほとんど出来ていないのですが、各アプリを覗いて得られるテキスト情報をアップしておきます。
(1)AknPictographImpl.dllの内部情報
CAknPictographDrawer,MAknPictographDrawer,CAknPictographAnimator,TAknStaticPictographDefKey,TAknAnimatedPictographDefKey の5つ
(2)AknPictograph.dllの内部情報
CAknPictographInterface の1つ
(3)AknPictograph.dllをimportする実行ファイルの内部情報
MAknPictographAnimatorCallBackを有する(avkonfep.dllのみ例外)
その他に関連しそうなものとして
TAknEdwinPictographDrawerE(eikcoctl.dll)
CMIDPictograph(lcdgr.dll)
参考になりましたら、幸いです。

蛇足ですがtwitterクライアントの絵文字表示に関して、S60のMIDPは標準で絵文字描画インターフェイスをサポートしている模様でtwiblleは表示可能。一方、ネイティブは絵文字描画のインターフェイスを作りこまねばならないのでgravityは表示不可。と想像しています。

ま~ 2009/5/24 日曜日

>レオナパパさんへ
貴重な情報をありがとうございますm(_ _)m
自分もそこまで把握しているわけでは無いので調査しつつこれらの情報を照らし合わせてみます。

しかしMIDPで表示できるのは意外でした(-_-;
MIDPのVMっていつも想像外の挙動をするので戸惑わされます…。

レオナパパ 2009/5/25 月曜日

あまり面白くない情報で申し訳ないですが、調査結果を報告します。
FEATMGR.hをネット上で見つけた(SDKにはなかった)。
どうやらfeatureIDを引数として受けて端末の環境を返している模様です。
AknPictograph.dllでFEATMGR.dllを呼び出している際の引数は 0x437 = 1079 です。
調査中のbrowserengine.dllの絵文字呼出し前の条件分岐でも同じ値が使われています。
SDKのfeatureinfo.hには該当する値は存在しませんが、日本語版のfeatureIDが1080で規定されています。
/** Device uses Japanese language variant. */
const TInt KFeatureIdJapanese = 1080;
ネット上でfeatureID 1079を見つけることはできませんでしたが、多分これが絵文字使用可否(AknPictographImpl.dllの有無)のfeatureIDではないかと考えています。
例えば日本語版でもE61日本語版や6630日本語版は絵文字を持っていません。
(E61日本語版ユーザーの方から今回の方法でカラー絵文字が表示できたとの連絡がありましたので、アプリ構成は同じと思われます。)

さらにFEATMGR.dllが参照するStaticFeatures.dllを調べたところ、705NKのものには0x437と0x438のデータが存在しましたが、N73MEのものには存在しないことを確認しました。
想定どおりこのStaticFeatures.dllは端末の環境情報を保持しているものと考えられます。
(時間があればもう少し調べて、これに変更を加えてカラー絵文字が表示できるのか確認したいと思います。)

状況から見てこれをまともな方法で変更することは不可能と思われ、結果、3rdPartyでAknPictograph.dllを利用したカラー絵文字利用は不可能かと思われます。

ま~ 2009/5/25 月曜日

>レオナパパさんへ
調査報告をありがとうございましたm(_ _)m
なるほど、それはちょっと面白くない結果ですね(涙)
エミュレータレベルではAknPictographInpl.dllを「\sys\bin\」にコピーしたらなぜか動いてくれたのでちょっとだけぬか喜びしていたのですが…。
あと2ndFP2(Japanese)をインストールしてみましたが、3rdMR以上の収穫はありませんでした。
#SDKに記述はあるものの絵文字表示はできませんでした。

もし直接聞ける機会が作れましたらぜひ中の人に突撃してみたいですね(笑)。

レオナパパ 2009/5/27 水曜日

すでに連絡していますが、こちらにもコメントいれておきます。
StaticFeatures.dllの呼び出しはAknPictographImpl.dllと同じくドライブレター付でz:\sys\binになっていますが、c:\sys\binで置換え可能を確認しまた。
また、StaticFeatures.dllに絵文字のfeatureID x437を加えることで絵文字が正常に利用できます。先の想定を検証できたものと思います。
StaticFeatures.dllの書換えをSymbianが認証してくれるかどうかは判りませんが、AknPictographImpl.dllが作れればカラー絵文字の正規利用が可能になるかも知れません。
長々と失礼しました。

ま~ 2009/5/27 水曜日

>レオナパパさんへ
それは吉報ですね~♪
しかしStaticFeatures.dllはSDKドキュメントでサーチしても出てきませんでした。
そのかわり、「CFeatureDiscovery::IsFeatureSupportedL」というそれっぽいAPIは見つかりました。
おそらくこいつにその追加したIDを渡してやるとTrue/Falseが返ってくるのだと思います。
ただ、さすがに取得APIはあっても設定APIが無いのでやはりおっしゃる方法に頼るしかないのかもしれません;;

レオナパパ 2009/6/1 月曜日

StaticFeatures.dllに関して調べたことを報告します。
ネット上を探ったり、逆アッセンブリしてみたりしてみたのですが、芳しい結果は得られていません。
FEATMGR.DLLではDll::TlsやDll::SetTLSが使われているのですが、主に引数の受渡しに用いられているようです。
StaticFeatures.dllには使用されていませんでしたので、WSDは使用できない模様です。
また、ClassはMStaticFeaturesとCSpdStaticFeaturesを持つようですが、これがどのようなものか解明できません。
ネット上の情報ではStaticFeatures.libにNewStaticFeaturesLなるglobal functionが定義されているようなのですが、これもそれ以上のことが判りませんでした。
何よりショックだったのが、E71のStaticFeatures.dllを覗いたときN73MEとプログラムが違ったことでした。
FP2や5thとも異なる可能性があります。
特に5thではDynamic Feature Managerなる文言があったので期待してSDK内を探したのですが、該当するようなドキュメントが得られませんでした。
http://developer.symbian.com/main/downloads/papers/What's_new_for_developers_v9.5.pdf

残念ですが手詰まりです。解決策が思いつかないです。

ま~ 2009/6/2 火曜日

>レオナパパさんへ
ご報告ありがとうございますm(_ _)m。
該当DLLはリードオンリーな仕様なんでしょうね。
勝手な推測ですが、各デバイスの能力の差異をこのDLLで指定しているのではないかと思います。
端末を作る上で、DLL一個でOS上の機能をOn/Off制御できるなら楽でしょうし。
うーん、残念です;;

コメントフォーム
入力した情報を記憶する

トラックバック:0

この記事のトラックバック URL
http://digilife.bz/blog/wp-trackback.php?p=3009
トラックバックの送信元リスト
SDKドキュメントから見るS60と絵文字の関係 - DIGIらいふ ~COOLにいこう!~ より

ホーム > FEP | Nokia | S60 2nd | S60 3rd | S60 5th | Symbian | 開発 > SDKドキュメントから見るS60と絵文字の関係

検索
フィード
メタ情報

ページの上部に戻る