Mobile:NEWS 2003年11月14日 08:35 PM 更新

BREW プログラミング入門(4)
BREW の文字列について知ろう(2/2)


前のページ

ワイド文字のエンコード

 ここでちょっと一休みをして、AECHAR型のエンコードについてお話します。重要なお話ではありませんから、気軽に読み流してください。  AECHAR型に日本語を格納できることは理解できました。では、内部的には、AECHAR型はどのような文字エンコードをもつのでしょうか。

 AECHAR型は実際には16ビット符号なし整数です。16ビットであることから Unicode (UTF-16) ではないかと推測される方がいるかもしれませんが、Unicodeではありません(Unicodeの場合もあるかもしれませんが)。

 実は、AECHAR型がどのような文字エンコードをもつか (BREWによりどのようなエンコードとして解釈されるか)という問題は、携帯電話端末のエンコード(端末エンコード)に完全に依存しています。

 日本語を表示できる携帯電話端末の場合、端末エンコードはたいていShift_JISですが、その場合、AECHAR型はShift_JISエンコードから派生したエンコードを持ちます。

 「BREW APIリファレンス」を開いて、STREXPAND() 関数の説明をよく調べてみてください。次のように記述されています。

入力文字列をワイド文字に拡大します。127 以下の文字は幅が2倍に拡大されます。
127を超える文字はpDestにコピーされます。

 つまり、char型にShift_JISエンコード文字列を指定してSTREXPAND() を呼び出すと、Shift_JISのうちASCIIコードの文字は、そのコードがAECHAR文字として格納され、マルチバイト文字は2バイトコードがAECHAR文字として格納されます。

 下の図を見ると、AECHAR文字列がどのようなエンコードをもつか、一目瞭然でしょう。


※半角カタカナは、127を超えるコードをもつにも関わらず、ASCII文字と同じように拡大されるようです(BREWエミュレータで確認)。したがって、「BREW APIリファレンス」の STREXPAND() の説明は誤っているようです

文字列の描画とフォント

 BREWで文字列を描画する関数は IDISPLAY_DrawText() です。この関数は、指定されたフォントで、指定された四角形内に、文字列を描画します。中央揃え、右寄せ、などもできます。

 ただひとつ、文字列の折り返し描画ができないのが不便な点です。後で、文字列の折り返し描画を行うアプレットを作成してみることにします。IDISPLAY_DrawText() の関数プロトタイプは以下のようになります。

int IDISPLAY_DrawText
(
    IDisplay * pIDisplay,     // IDisplay オブジェクト
    AEEFont Font,             // フォント
    const AECHAR * pcText,    // 描画する文字列
    int nChars,               // 描画する文字数
    int x,                    // 左上X座標
    int y,                    // 左上Y座標
    const AEERect * prcBackground,  // クリップする長方形
    uint32 dwFlags            // 右寄せなどのフラグ
)

 文字列を描画するには、フォントを指定する必要があります。フォントは AEEFont型の定数で指定します。BREW SDK 2.1では以下の定数が用意されています。

typedef enum {
    AEE_FONT_NORMAL=0x8000,   // 通常のフォント
    AEE_FONT_BOLD,            // 太字のフォント
    AEE_FONT_LARGE,           // 大きいフォント
    AEE_FONT_TOTAL            // 使われていません (将来のための予約)
} AEEFont;

 もちろん、携帯電話端末でサポートされていなければ、AEE_FONT_BOLD を指定したからといって必ずしも太いフォントになるわけではありませんし、AEE_FONT_LARGE が必ず AEE_FONT_NORMAL より大きいサイズになるという保証はありません。実際の表示は携帯電話端末の仕様に依存します。

 携帯電話の仕様に依存しない描画を行うには、それぞれのフォントのサイズを取得する必要があります。そのためには IDISPLAY_GetFontMetrics() 関数を使用します。

int IDISPLAY_GetFontMetrics
(
    IDisplay * pIDisplay,
    AEEFont Font,         // フォントを指定する
    int * pnAscent,       // フォントのアセントを取得する
    int * pnDescent       // フォントのディセントを取得する
)

 フォントのアセントとかディセントについてご存知ない方は、「BREW APIリファレンス」の AEEFontInfo の項目に解説がありますので、ご参照ください。とりあえず、フォントの高さは「アセント+ディセント」の値である、という理解で十分でしょう。

 BREWのフォントには「フォントの幅」という情報はありませんが、特定のフォントで特定の文字列を描画したときの横幅を計算することはできます。これを計算するには、IDISPLAY_MeasureText() または IDISPLAY_MeasureTextEx() 関数を使います。この関数の詳細は「BREW APIリファレンス」をご参照ください。

※「BREW APIリファレンス」には、フォントに関係する IFont という。インターフェイスについて記述がありますが、BREWアプリの開発者がこのインターフェイスを使用することはないと思われますので、知る必要はありません。

今回のサンプルアプリ

 それでは、今回学んだ知識を元にして、四角形の中に長い文字列を改行しながら表示するアプレットを作成してみましょう(クリックで別ウィンドウにソースコード表示)。

※今回の記事のソースコードは、ソフィア・クレイドル のサイトからダウンロードできます。

著者紹介
倉谷智尋:ソフィア・クレイドル研究開発部チーフサイエンティスト。ソフィア・クレイドルは、2002年2月京都市にて、無限の可能性を秘めたソフトウェア職人たちが楽しく集い、自ずと自己実現が達成される場になることを目指して創業。在籍スタッフの平均年齢は20代前半と若いが、その大半がプログラミング歴10年以上とそのプロフェッショナリティは極めて濃い集団である。

 これまでにBREW用アプリケーションフレームワークケータイJavaプログラム圧縮技術ケータイJavaブラウザ技術、ケータイメッセンジャー技術などを総合的に研究開発し、「高品質な共通プラットフォーム」の実現を目指してきた。

ご感想、ご質問はこちら(zdnet-contact@s-cradle.com)まで。



関連記事
▼ BREW プログラミング入門(3):画面に描画をしてみよう
前回の連載では、HelloWorldアプレットを作成することで、BREWアプリケーションのおおまかな構造について学びました。今回は画面描画のAPIについて詳しく説明するとともに、インタフェースやアプレット構造体についての理解を深めます。

▼ BREW プログラミング入門(1):BREW SDKをインストールしよう
本連載は、BREWに興味がありプログラミングを始めてみたいけれど、どこから手をつけてよいか分からない方々を対象に、ステップ・バイ・ステップでBREWプログラミングを行う方法を解説していきます。

▼ BREW プログラミング入門(2):“HelloWorld”プログラムを作ろう
前回の連載では、BREW SDK 2.1をインストールするところまで解説しました。今回は実際にソースコードを書き、BREWエミュレータで動かしてみましょう。画面に "Hello World" と表示する簡単なBREWアプリを作成します。

▼ Qualcomm、携帯電話向けプラットフォーム「BREW」発表──au端末に搭載
▼ “携帯電話のOS”を目指すBREW──国内でも1号機
▼ BREWとは何か?──Javaとの違い

[倉谷智尋, ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.

前のページ | 2/2 | 最初のページ



モバイルショップ

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!