ホーム > デベロッパ > BREW FAQ

BREW FAQ : 文字列

文字列クラスとは ?

文字列クラス とは、文字列操作を簡単に行うための 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::DrawTextSFXGraphics::DrawTextSFXGraphics::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 型の内部エンコードについて教えてください。

AECHAR 型は 16 ビット符号なしの整数型ですが、Unicode ではありません。 AECHAR 型の文字エンコードは端末に依存しており、 日本製の端末では Shift-JIS エンコードです。

詳細は、以下の Web サイトを参照してください。
BREW プログラミング入門 「BREW の文字列について知ろう !」

      

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++ からエミュレータを起動してください。

  1. VC のメニューボタンから [プロジェクト] - [設定] を選択します。
  2. [プロジェクトの設定] ダイアログ ボックスの[デバッグ] タブを選択します。
  3. [デバッグセッションの実行可能ファイル] に BREW エミュレータを設定してください。
  4. [OK] ボタンを押して変更を反映してください。
  5. [ビルド] - [デバッグの開始] - [実行] を選択してください。
  6. BREW エミュレータが立ち上がります。

実機では、BREW Logger を使用してください。