文字列クラスとは ?
文字列クラス とは、文字列操作を簡単に行うための C++ クラスです。 BREW API を使用した C 言語プログラミングでは、このようなクラスが存在しないため、 開発者は文字列ポインタを直接操作する必要があります。
SophiaFramework には、char 文字列を扱う SFXAnsiString クラスと、BREW のワイド文字列を扱う SFXWideString クラスが用意されています。
SophiaFramework の文字列クラスを使用すると、以下の操作を簡単に行えます。
[ BREW API のみを使用したコード ]
//
// BREW API のみを使用した文字列操作
//
AECHAR helloWorld[16] = {0};
int result = 0;
int helloLen = 0;
int worldLen = 0;
// 文字列を初期化します。
AECHAR hello[] = {'H','e','l','l','o', '\0'};
AECHAR world[] = {'W','o', 'r', 'l', 'd', '\0'};
// 文字列を連結します。
WSTRCAT(helloWorld, hello);
WSTRCAT(helloWorld, world);
// 文字列を比較します。
result = WSTRCMP(hello, world);
if (result < 0) {
DBGPRINTF("*** world is bigger ***");
}
else if (0 < result) {
DBGPRINTF("*** hello is bigger ***");
}
else {
DBGPRINTF("*** hello is the same as world ***");
}
// 文字列の長さを取得します。
helloLen = WSTRLEN(hello);
worldLen = WSTRLEN(world);
[ SophiaFramework を使用したコード ]
//
// SophiaFramework の文字列クラスを使用した文字列操作
//
SFXWideString helloWorld;
SInt32 helloLen = 0;
SInt32 worldLen = 0;
// 文字列を初期化します。
SFXWideString hello("Hello");
SFXWideString world("World");
// 文字列を連結します。
helloWorld += hello;
helloWorld += world;
// 文字列を比較します。
if (hello < world) {
DBGPRINTF("*** world is bigger ***");
}
else if (hello > world) {
DBGPRINTF("*** hello is bigger ***");
}
else {
DBGPRINTF("*** hello is the same as world ***");
}
// 文字列の長さを取得します。
helloLen = hello.GetLength();
worldLen = world.GetLength();
文字列を描画するには ?
文字列を描画するには、IDisplay インターフェイスの IDISPLAY_DrawText 関数を使用します。
SophiaFramework では、SFBDisplay::DrawText、 SFXGraphics::DrawText、 SFXGraphics::DrawString の各関数を使用します。
[ BREW API のみを使用したコード ]
// 表示する文字列を作成します。
AECHAR text[] = {'H','e','l','l','o',' ','W','o', 'r', 'l', 'd', '\0'};
// 画面に文字列を表示します。
IDISPLAY_DrawText(app->m_pIDisplay,
AEE_FONT_BOLD, // 太字のフォント
text, // 表示する文字列
-1, // -1 = 文字列をすべて表示する
0, // 無視される
0, // 無視される
NULL, // クリッピングしない
IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); // 左右中央揃え、上下中央揃え
// 画面を更新します。
IDISPLAY_Update (app->m_pIDisplay);
[ SophiaFramework を使用したコード ]
// 表示する文字列を作成します。
SFXWideString text("Hello World");
// SFBDisplay インスタンスを作成します。
SFBDisplaySmp display(SFBDisplay::GetInstance());
// 画面に文字列を表示します。
display->DrawText (AEE_FONT_BOLD, // 太字のフォント
text, // 表示する文字列
-1, // -1 = 文字列をすべて表示する
0, // 無視される
0, // 無視される
IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); // 左右中央揃え、上下中央揃え
// 画面を更新します。
display->Update();
AECHAR 型の内部エンコードについて教えてください。
char 文字列とワイド文字列を変換するには ?
char 文字列とワイド文字列を変換するには、STREXPAND 関数や WSTRCOMPRESS 関数を使用します。
SophiaFramework では、 SFXAnsiString クラスや SFXWideString クラスのコンストラクタを使用して、char 文字列とワイド文字列を変換できます。
[ BREW API のみを使用したコード ]
//
// 文字列を変換します。
//
char helloCharSrc[] = {'H','e','l','l','o','\0'};
AECHAR helloWideSrc[] = {'H','e','l','l','o','\0'};
char helloChar[16] = {0};
AECHAR helloWide[16] = {0};
// char 文字列をワイド文字列に変換します。
STREXPAND(helloCharSrc, sizeof(helloCharSrc), helloWide, sizeof(helloChar));
// ワイド文字列を char 文字列に変換します。
WSTRCOMPRESS(helloWideSrc, sizeof(helloWideSrc), helloChar, sizeof(helloWide)
* sizeof(AECHAR));
[ SophiaFramework を使用したコード ]
//
// 文字列を変換します。
//
SFXAnsiString helloCharSrc("Hello");
SFXWideString helloWideSrc("Hello");
SFXAnsiString helloChar;
SFXWideString helloWide;
// char 文字列をワイド文字列に変換します。
helloWide = helloCharSrc;
// ワイド文字列を char 文字列に変換します。
helloChar = helloWideSrc;
ワイド文字列を UTF-8 に変換するために WSTRTOUTF8 関数を使用しましたが、 正しく変換されません。
WSTRTOUTF8 関数は、その名前に反して、 ワイド文字列を UTF-8 に変換する関数ではなく、 UTF-16 を UTF-8 に変換する関数です。
また、UTF8TOWSTR は、 UTF-8 をワイド文字列に変換する関数ではなく、 UTF-8 を UTF-16 に変換する関数です。
リソースエディタから「文字列」を読み取るには?
BREW のリソースファイルから文字列を読み込むには ISHELL_LoadResString() 関数を使用します。また、文字列を読み込むために必要となるヒープのサイズは ISHELL_GetResSize() 関数で計算できます。
uint32 size;
AECHAR* buffer;
ISHELL_GetResSize(shell, "myres.bar", 128, RESTYPE_STRING, &size);
if ((buffer = MALLOC(size)) != NULL) {
ISHELL_LoadResString(shell, "myres.bar", 128, buffer, size);
.. 文字列を利用
FREE(buffer);
}
以上のようなコードで文字列を利用することが可能となります(細かいエラー処理は記述されていません)。
また、リソースファイルを作成する場合は、BREW リソースエディタで文字列リソースを作成し、文字エンコーディングを S-JIS に設定してください。
絵文字を入力禁止にできますか?
現在 BREW で使用可能な入力モードが下記設定しかありませんので、絵文字だけを排除することはできないかと思われます。
#define AEE_TM_NONE 0x0000
#define AEE_TM_CURRENT 0x0001
#define AEE_TM_SYMBOLS 0x0002
#define AEE_TM_LETTERS 0x0003
#define AEE_TM_RAPID 0x0004
#define AEE_TM_NUMBERS 0x0005
#define AEE_TM_KANJI 0x0006 // Japanese Input
#define AEE_TM_HANKAKU_KANA 0x0007 // Japanese Input
#define AEE_TM_HANGUL 0x0008 // Korean Input
#define AEE_TM_PINYIN 0x0009 // Chinese Input
#define AEE_TM_STROKE 0x000A // Chinese Input
#define AEE_TM_EZTEXT 0x000B // Zi's Predictive Entry
#define AEE_TM_T9 0x000C // Tegic's Predictive Entry
AEE_TM_KANJI はひらがなもカタカナも2バイト文字の入力モードと考えられ、絵文字もそれに含まれるはずです。
解決法として、絵文字を入力時に排除するのではなくて、入力が終わったあとに、絵文字の部分だけ文字列から削除する方法があります。
絵文字一覧は、KDDI のサイトからダウンロード可能です。
http://www.au.kddi.com/ezfactory/tec/spec/3.html
デバッグ出力で日本語を表示できますか ?
表示できます。
エミュレータでは、Visual C++ のアウトプット ウィンドウを使用して、 デバッグ出力を日本語で表示します。 アウトプット ウィンドウにデバッグ出力を表示するには、 以下の手順で Visual C++ からエミュレータを起動してください。
- VC のメニューボタンから [プロジェクト] - [設定] を選択します。
- [プロジェクトの設定] ダイアログ ボックスの[デバッグ] タブを選択します。
- [デバッグセッションの実行可能ファイル] に BREW エミュレータを設定してください。
- [OK] ボタンを押して変更を反映してください。
- [ビルド] - [デバッグの開始] - [実行] を選択してください。
- BREW エミュレータが立ち上がります。
実機では、BREW Logger を使用してください。