読者です 読者をやめる 読者になる 読者になる

NotesとQtでWindows、Mac OS X、Ubuntuのデスクトップアプリ(その4 - LMBCS概略編)

次はLMBCSです。

LMBCS(リンビックス、Lotus Multi-Byte Character Set)はNotes固有の文字コードセットで、STATUSの次にラッパークラスを用意したい概念です。 日本語以外の知識を持ち合わせていないのですが、日本語のみで考えればLMBCSの日本語はシフトJISがベースになっています。これは、Windows版に限らず、Max OS Xでも、Linux版でも同様だそうです。

シフトJISは、ざっくりと半角英数字、半角カナ文字、全角文字の3つに分類されます。半角文字は1バイト、全角文字は2バイトです。LMBCSは、半角英数字はそのままで1バイト、全角文字には文字コード¥x10を頭に付けて3バイト、半角カナ文字には文字コード¥x10を2つ頭に付けて3バイトの形式を取ります。

シフトJIS バイト数 LMBCS バイト数
ABCDE 5 ABCDE 5
あいうえお 10 ¥x10あ¥x10い¥x10う¥x10え¥x10お 15
アイウエオ 5 ¥x10¥x10ア¥x10¥x10イ¥x10¥x10ウ¥x10¥x10エ¥x10¥x10オ 15

ただし、これらをユーザがいちいち変換する必要はありません。Notes APIにOSTranslateという関数があります。Notes/Domino APIプログラミング―C++とSTLによる実践的プログラミングでは、std::stringを用いてLMBCSを表現し、シフトJISとLMBCSを相互に変換する関数を紹介しています。

OSTranslateは次のような仕様になっています。

<osmisc.h>

WORD LNPUBLIC OSTranslate(WORD TranslateMode
                          , const char far *In, WORD InLength
                          , char far *Out, WORD OutLength);

引数TranslateModeは定数で、どの文字コードからどの文字コードに変換するかが決まった定数を割り当てます。

<osmisc.h>

/* Charsets used with OSTranslate */

#define OS_TRANSLATE_NATIVE_TO_LMBCS    0    /* Translate platform-specific to LMBCS */
#define OS_TRANSLATE_LMBCS_TO_NATIVE    1    /* Translate LMBCS to platform-specific */
#define OS_TRANSLATE_LOWER_TO_UPPER     3    /* current int'l case table */
#define OS_TRANSLATE_UPPER_TO_LOWER     4    /* current int'l case table */
#define OS_TRANSLATE_UNACCENT           5    /* int'l unaccenting table */

#ifdef DOS
#define OS_TRANSLATE_OSNATIVE_TO_LMBCS  7    /* Used in DOS (codepage) */
#define OS_TRANSLATE_LMBCS_TO_OSNATIVE  8    /* Used in DOS */
#elif defined (OS2)
#define OS_TRANSLATE_OSNATIVE_TO_LMBCS  OS_TRANSLATE_NATIVE_TO_LMBCS
#define OS_TRANSLATE_LMBCS_TO_OSNATIVE  OS_TRANSLATE_LMBCS_TO_NATIVE
#else
#define OS_TRANSLATE_OSNATIVE_TO_LMBCS  OS_TRANSLATE_NATIVE_TO_LMBCS
#define OS_TRANSLATE_LMBCS_TO_OSNATIVE  OS_TRANSLATE_LMBCS_TO_NATIVE
#endif

#if defined(DOS) || defined(OS2)
#define OS_TRANSLATE_LMBCS_TO_ASCII     13
#else
#define OS_TRANSLATE_LMBCS_TO_ASCII     11
#endif

#define OS_TRANSLATE_LMBCS_TO_UNICODE   20
#define OS_TRANSLATE_LMBCS_TO_UTF8      22
#define OS_TRANSLATE_UNICODE_TO_LMBCS   23
#define OS_TRANSLATE_UTF8_TO_LMBCS      24

「NATIVE」というのが、日本語環境ではシフトJISにあたります。

Inには変換元の文字列、InLengthにはその長さ(バイト単位)、Outには変換後の文字列を格納する領域、OutLengthにはその領域の長さ(バイト単位)を指定します。戻り値は、変換後の文字列の実際の長さ(バイト単位)になります。

注意したいのは、入出力ともにWORD=64kバイト分の文字列しか処理できないことです。これは、最新のAPIキットでも変わっていません。

最近では、OSレベルでUnicodeがサポートされ、Qtにおいても文字コードUnicodeが標準です。幸いなことに、OSTranslate関数はNATIVE以外にUNICODE、UTF8も変換対象になっています。

Qtにおいて文字はUnicode(UTF-16)表現のQCharクラス、文字列表現はQCharの配列、QStringクラスを使います。Unicode以外の文字コードを扱う場合は、QByteArrayが使われます。

そこで、ここではLMBCSをQByteArrayの派生クラスとして定義し、QStringと相互に変換できるようにします。(続く)