本家のオンラインマニュアル

多国語文字列の扱い

 C++のプログラミングの際,意外に面倒な思いをするのが多国語文字列の扱いです. 半角文字のみからなる文字データを扱う場合は「1文字は1バイト」で表現されますが, 全角文字などを含んだ多国語の文字は,1文字を表現するのに複数バイトの記憶領域を使用します. このため,与えられた文字列から「〜文字目」と指定して文字を取り出すことが容易ではありません. また,C++の標準ライブラリとして提供されている文字列関連のクラスの機能も, 十分に満足できる状況ではありません.wxWidgetsのwxStringクラスは, Unicode(UTF8)の文字列を扱うための強力な機能を提供しており,ここではそれを紹介します.

● 半角文字と全角文字が混在する文字列の取り扱い

 半角文字と全角文字が混在する文字列から「〜文字目」を指定して部分文字列を取り出す方法を, サンプルプログラム Utf8String.cpp を例に挙げて紹介します.

プログラム全体:Utf8String.cpp
#include <wx/wx.h>

int main()
{
    int	c, l;
    char	s1[] = "全a角b文c字dとe半f角g文h字iのj混k在l";
    char	s2[1024];

    wxString wxs = wxString::FromUTF8(s1);

    l = wxs.Len();
    for ( c = 0; c < l; c++ ) {
        strcpy(s2, wxs.Mid(c,1).ToUTF8());
        printf("%2d: \"%s\"\n",c,s2);
    }
}
ソースプログラムはUTF8で記述されているとします.

 プログラム中のs1は,半角文字と全角文字が混在する文字列へのポインタです. この文字列を FromUTF8() 関数によってwxStringのオブジェクト wxs に変換しています. wxStringオブジェクトの長さ(文字数)を求めるには Len() 関数を使用します. 部分文字列を得るには Mid() 関数を使用します. wxStringオブジェクトをUTF8の文字列データに変換するには ToUTF8() 関数を使用します.

 このプログラムをコマンド環境で実行すると, 文字列の先頭から1文字づつ文字が取り出されて表示される様子が確認できます.(下記実行例参照)

 0: "全"
 1: "a"
 2: "角"
 3: "b"
 4: "文"
 5: "c"
 6: "字"
 7: "d"
 8: "と"
 9: "e"
10: "半"
11: "f"
12: "角"
13: "g"
14: "文"
15: "h"
16: "字"
17: "i"
18: "の"
19: "j"
20: "混"
21: "k"
22: "在"
23: "l"


2014/09/04