株式会社エス・スリー・フォー

3.8 ワイド文字列

RWWString クラスも各種の文字操作に用いるもので、ワイド文字に対して機能する点を除けば、RWCString に似ています。すべての文字が同じサイズ (wchar_t のサイズ) であるため、マルチバイト文字よりも操作が簡単です。

Tools.h++ では、マルチバイトとワイド文字列間で両方向の変換を簡単に行うことができます。前記の例 Sun で、どのように変換を行うかを示します。

#include <rw/cstring.h>
#include <rw/wstring.h>
#include <assert.h>
main() {
RWCString Sun("\306\374\315\313\306\374");
RWWString wSun(Sun, RWWString::multiByte); // マルチバイト文字をワイド文字にする

RWCString check = wSun.toMultiByte();
assert(Sun==check);                                         // OK
return 0; }

基本的に、次の特殊な RWWString コンストラクタを使ってマルチバイト文字列をワイド文字列に変換します。

RWWString(const char*, multiByte_);

パラメータ multiByte_ は、例に示されているように唯一の可能な値 multiByte を持つ列挙子です。この変換は比較的計算量が多いため、multiByte 引数を用いることにより、間違って変換を行うことがないようにしています。toMultiByte() 関数を使う、ワイド文字列をマルチバイト文字列に戻す変換も、同様に計算量が多くなります。

RWCString が完全に ASCII 文字から構成されていることがわかっている場合は、どちらの方向の変換でも計算量を大幅に減らすことができます。これは、高位ビットの簡単な操作で変換が行えるためです。

#include <rw/cstring.h>
#include <rw/wstring.h>
#include <assert.h>
main() {
RWCString EnglishSun("Sunday");                   // ASCII 文字列
assert(EnglishSun.isAscii());                               // OK

// Ascii からワイド文字に変換:
RWWString wEnglishSun(EnglishSun, RWWString::ascii);

assert(wEnglishSun.isAscii());                              // OK
RWCString check = wEnglishSun.toAscii();
assert(check==EnglishSun);                                  // OK
return 0; }

文字列が完全にASCII 文字から構成されていることを確実にするために、メンバ関数 RWCString::isAscii() と RWWString::isAscii() をどのように使用したかに注目してください。RWWString コンストラクタ

RWWString(const char*, ascii_);

を使って、ASCII をワイド文字に変換します。パラメータ ascii_ は、唯一の可能な値 ascii を持つ列挙子です。

メンバ関数 RWWString::toAscii() を使って元に変換し直すこともできます。