Symbian OSアプリ開発の手引き

Symbian OSアプリ開発の手引き(4)

Symbian流“日本語表示”と“文字列操作”

大久保 潤 管理工学研究所 2008/6/27

Symbian OSの全体像を概観した「Symbian OS開発の勘所」の続編となる今回は、“実際にどのようなプログラムを書くのか?”をテーマにSymbian OS向けのアプリケーション開発における心得を分かりやすく伝授する。(編集部)

- PR -

 今回は、イディオム編の第2弾として“文字列”について解説します。文字列と一言でいいますが、環境によって表現方法がいろいろあるのはファーストシーズン第5回「堅牢で省資源な文字列“ディスクリプタ”」で説明したとおりです。Symbian OSの場合は実装を隠ぺいし、機能のみを公開するというOO(Object Oriented)の方法にのっとって安全な文字列機能を、性能を犠牲にせず実現しています。

 この文字列関連のクラスの使い方を具体的に説明していこうというのが今回のアウトラインです。とはいえ、まだこの連載では日本語を表示する方法を説明していませんでしたので、まずは日本語の表示方法を解説した後、紙数の許す限り文字列操作の解説を行います。

日本語の表示−設定の切り替え

 前回まで使っていた実習環境には1つ問題点がありました。メニューも何もかも英文ですよね。そこで、実習を始める前に表示環境を日本語に切り替えたいと思います。

 Windowsのスタートメニューに登録されている「S60 Developer Tools」の中に「3rd Edition FP2 SDK」という今回使っているSDKのサブメニューがあるはずです。そのさらに下に「Languages」というサブメニューがあり、その中に「Change to Japanese」というアイテムが存在します。これが環境を日本語に切り替えるためのプログラムです。早速実行してください。

 いかがでしょうか? 切り替えが完了したら、確認のためにCarbideを起動して連載第2回「GUIアプリ開発で必ず覚えてほしいポイント」で作成した“HelloGUIWorld”を起動してみましょう。すると図1の青色で囲った個所のように、日本語表示に切り替わっているのが確認できるはずです。

図1 日本語化結果

日本語の表示−リソースファイルの構造

 さて、日本語が表示できるようになると、今度は自分が作ったプログラムでも日本語を表示したくなってきます。Symbian OSではどうやって日本語を表示するのでしょうか。

 連載第2回では、

  • 文字列定数やアイコン、メニューの構成はリソースとして扱われる
  • リソースはdataフォルダ内の<プロジェクト名> + .rssという命名規則のファイルに定義される

ことまでをお伝えしました。なので、メニューの文字列を変えたい、ダイアログに表示する文字列を変更したいという場合、この.rssファイルを触ればいいような気がします。しかし、事態はもう少し複雑です。HelloGUIWorld.rssファイルを開いても図1に表示されている「Message」や「Message from file」などの文字列が見つからないからです。では、メニューに書かれている文字列はどこにあるのでしょうか。実は、HelloGUIWorld.rssと同じフォルダにあるHelloGUIWorld.rlsというファイルが実際の文字列の定義を受け持っています。

 このように別のファイルに定義を分ける理由は、複数言語のサポートにあります。英語とフランス語と日本語を支援するアプリケーションを作成しようとした場合を考えてみましょう。.rssファイルに直接文字列を埋め込む方法では複数言語の支援はなかなか面倒です(#defineでリソースをダイレクトに定義するような方式だと、対応言語が増えるたびに名前管理の手間が発生します)。そこで、Symbian OSでは言語ごとにリソース定義のファイルを分けて、複数言語の支援を容易にしています。それぞれの役割は以下のとおりです。

  • .rssファイルはリソースの論理的な構造と、C++ソースからアクセスする名前の根拠を定める。実際の文字列定義は.rlsファイルを参照する
  • .rlsファイルは単一の言語に関する文字列定義を持つ(言語ごとに.rlsファイルがある)。各.rlsファイルは.rssファイルが必要とする文字列定義を提供する必要がある(言語ごとにリソース定義が充足していることが保証される)
  • リソースコンパイラは1つの.rssファイルに対して複数の.rlsファイルが対応する関係(多言語環境)をサポートし、プログラム実行時に参照されるリソースファイルを作成する

 今回の連載では日本語環境のみを対象としますが、Symbian OSには複数言語支援の仕組みや約束事が基本的に組み込まれています。そのことはゼヒ覚えておいてください(注)

注:複数言語を支援する場合、「Symbian OS C++プログラミング 第2版」の400ページ以降の記述が参考になります。興味がある方はこちらもどうぞ。

日本語の表示−リソースファイルの書き換え

 では、いよいよHelloGUIWorld.rlsの書き換えです。Project Explorerのdataを広げると、図2にあるとおりHelloGUIWorld.rlsファイルが見つかるはずです。これをダブルクリックするとエディタが開き、内容が編集できるようになります。が、ちょっと待ってください。このままではあなたが書いた日本語リソースは文字化けして表示されることになります。リソースコンパイラはCP1252(ISO 8859-1の上位集合。すなわち8ビット幅の文字コード)でリソースが書かれていると思い込んでいるからです。

図2 .rlsファイルの位置化結果

というわけで日本語を扱う場合、リソースコンパイラに対して適切に指示を行うため、リソース定義ファイルには以下の事柄が要求されます。

  1. ファイルがUTF-8で書かれていること
  2. UTF-8でリソース定義を行っていることを、リソースコンパイラに明示的に通知すること

 ファイルの形式を変える方法はいろいろありますが、一番簡単な方法はCarbideを使うことです。図2のようにHelloGUIWorld.rlsを選択しているときに右クリックをして、表示されるメニューの一番下にある[Properties]エントリをクリックしてください。下記のダイアログが表示されます(図3)

図3 エンコーティング変更

 図3の青く囲まれた部分がエンコーディングの変更にかかわる部分です。初期状態ではDefaultのラジオボタンがチェックされているはずですが、これをOtherに切り替えて、横のリストボックスをUTF-8にしてください。これで[OK]ボタンを押下すればファイルの形式がUTF-8に変更されます(注)

注:どうもこの操作のときにエンコーディングの変換をきちんとやってくれていないようです。なので、この操作の前にはHelloGUIWorld.rlsへ日本語文字列を書き込まない方が吉です。

ところで、Carbide全体のデフォルトエンコーディングがUTF-8ではなくCP932となっているのはなぜなんでしょうか。ここは非常に疑問なところです。メニューの[Window]−[Preferences]−[General]−[Workspace]にtext file encodingの設定個所があり、ここでデフォルトをUTF-8に切り替えることで、以後個別操作を省略することが可能にはなるのですが……。

 リソース定義がUTF-8であることを伝えるにはCHARACTER_SETというディレクティブ(注)を使い、引数にUTF8を渡します。

注:本当は“ダイレクティブ”と表記したいのですが、ぐっとこらえて一般的な表記にしておきます。

リスト1 .rlsファイルへのディレクティブ挿入

 ここで気を付けてほしいことが1つあります。どうもリソースコンパイラは控えめな性格らしく、引数の名前を間違えたとしても、エラーとはせずに下記のような警告を出すだけで先に進んでしまいます。例えばCHARACTER_SET utf8と記述した場合、リソースコンパイラは以下のウォーニングメッセージを返してきます。

Unrecognised character set name 'utf8'

 DocBrowserでCHARACTER_SETの説明を検索してもらうと分かるのですが、このディレクティブが受け取る引数はCP1252かUTF8に限られています。先述のウォーニングメッセージが示すとおり、utf8が引数に指定されても、リソースコンパイラは決してリソース定義がUTF-8で行われているとは見なしません。その場合、デフォルトのCP1252がキャラクターエンコーディングであると見なされるので、リソース定義中に書かれた日本語は文字化けして表示されます。日本語が正しく表示されないという場合、ウォーニングが出ていないか確認してみましょう。

 この2点の処置さえ済んでしまえば、HelloGUIWorld.rlsに日本語の記述を行うことが可能になります。確認のため、メニューとダイアログに表示される文言を日本語化してみましょう。どうでしょう、実行したHelloGUIWorldは正しく日本語を表示したでしょうか。

リスト2 HelloGUIWorld.rls 日本語化例

 ちなみに先に述べたとおり、.rlsファイルは.rssファイルから参照されます。HelloGUIWorld.rssを開いて見てもらえば分かるとおり、上述のqtn_command1、qtn_command2は、

RESOURCE        MENU_PANE        r_menu


で、qtn_command1_textは、

RESOURCE        TBUF             r_command1_text

で、それぞれ参照されています。そして何を隠そう(隠してないか)、r_menu、r_command1_textなど.rssファイルで定義されているリソースは、それをプログラムからアクセスするためのIDがリソースコンパイラから自動的に提供されることになります(それらのIDは拡張子.rsgを持つファイルに格納されます)。

 例えば、HelloGUIWorldにおいてメニューに対応する処理を行っているHelloGUIWorldAppUi.cppにも、拡張子.rsgのファイルが1つインクルードされているはずです。このファイルにプログラム側からリソースをアクセスするための識別子がdefineされています。そしてその名前は.rssファイルに書かれているリソースの名前を大文字にしたものです。

 逆にいうと、.cpp側で見えているR_COMMAND1_TEXTというリソースは同名小文字のリソース定義が.rssファイルに存在しており、その値の定義は.rlsファイルに含まれているのです。以後、文字列リソースなどを追加する必要が発生した場合には、このルールに従って既存エントリのCOPY&MODIFY作業を行ってください。

  • 連載バックナンバー
  • 全記事インデックス
  • 組み込み開発トップ
  • MONOistトップ

ホワイトペーパーTechTargetジャパン

メールマガジン

スキルアップ/キャリアアップ(JOB@IT)

スポンサーからのお知らせ

Windows Embeddedコーナー

Windows Embedded
Windows Embedded専門コーナー。Windows Embedded StandardやWindows Embedded CEをはじめとする「Windows Embedded」ファミリの最新動向や技術情報をお届けします!!

Androidコーナー

Android
Android専門コーナー。組み込みデバイスへの適用からアプリケーション開発、イベントレポート、ニュースなどAndroidに関するさまざまな技術情報がここに集結!!

@IT MONOist 求人情報