C++の基礎: WindowsでのUnicodeStringの使い方を学ぶ
概要
Unicodeの標準規格であるUnicodeStringは、ASCII(8ビット)文字よりも多くの文字(8ビット、16ビット、32ビット)に一意の番号を提供します。 Unicodeの文字列は、世界中の言語と絵文字をサポートしているため、広く使用されています。
モダンなC++では、文字列には、charの配列(char文字列)とUnicodeの文字列(WideStringとAnsiStringは古いため、現在ではすべての機能に対応していません)の2種類が使われています。
CLANG / C++Builder / GNU C / VC++のコンパイラやIDEでは、GUIフォームで扱われる文字列としてUnicodeを採用しているため、すべての言語をサポートし、グローバルなアプリケーションの作成が可能です。UnicodeStringの構造の詳細については、こちらを参照してください。RAD Studio、Delphi、C++Builderでは、Unicodeベースの文字列を使用しています。つまり、String型は、AnsiStringではなく、UnicodeStringです。既存コードをUnicodeに対応したアプリケーションへしたい場合は、こちらの記事をお勧めします。
C++では、一般的に4種類の文字列宣言があります。
- charの配列(基本型を参照)
- charはASCII形式になっており、各文字は1バイト(8ビット)のサイズで、0~255文字です。
- AnsiString
- 以前は、StringはAnsiStringのエイリアスでした。RAD Studio、C++Builder、Delphiでは、AnsiStringの形式が変更され、CodePageフィールドとElemSizeフィールドが追加されました。これによりAnsiStringの形式が新しいUnicodeStringと同じになります。
- WideString
- WideStringは、以前はUnicodeの文字データに使用されていました。 その形式は基本的にWindowsBSTRと同じです。WideStringは今でもCOMアプリケーションでの使用に適しています。
- UnicodeString (String)
- UnicodeStringのデータはUTF-16形式で、UTF-16の文字は2バイトまたは4バイトです。RAD StudioにはUnicodeに関する優れた記事があります。 ほとんどのIDE(RAD Studio、C ++ Builder、Delphi、Visual Studioなど)のstringのデフォルトの型はUnicodeString型です。これによって2009以降のバージョンのC++BuilderとDelphiでは、Char型とPChar型がそれぞれWideChar型とPWideChar型へ変更されました。
UnicodeStringに関するC++の例(CLANG / C++Builderコンパイラを利用)
UnicodeStringの宣言方法
UnicodeString ustr = L" مرحبا";
UnicodeString ustr2 = ustr + L"Hello " + L"DEF" ;
ustr=L"こんにちは";
ustr.printf( L"Pi is %8.2f", 3.14);
Lは文字列リテラルで、wchar_tリテラルを表します。u8、u、Uリテラルも使用できます。これらは、エディタやコンパイラのオプションでデフォルトで設定されている場合があるので、デフォルトがわかっていれば追加する必要はありません。
文字列リテラルは、二重引用符で囲まれた一連の文字でR、u8、u8R、u、uR、U、UR、L、LRといった任意の接頭語を持ちます。そして "R"(...)」、「u8″..."」、「u8R"(...)"」、「u"..."」、「uR"〜(...)〜"」、「U"..."」、「UR "zzz(...)zzz"」、「L"..."」、または「LR"(...)"」のように、それぞれダブルクォートで囲まれた文字列となります。
このドキュメントの「Working Draft, Standard for Programming Language C++」の文字列リテラルのセクションを参照してください。
ここでは、C++で使用されているこれらの標準のいくつかをまとめています。
文字列定義のための文字列リテラルへの例
- str="abcd";
- コンパイラ/IDEオプションに基づくデフォルト文字列
- str=u8″abcd";
- UTF-8の文字列リテラルで,ヌル終端を含むUTF-8でエンコードされた特定の文字で初期化されます。
- str=u "abcd";
- char16_tの文字列リテラルで、char16_t文字列リテラルは、ヌル終端を含む「n個のconst char16_tの配列」です。
- str=U "abcd";
- char32_tの文字列リテラルで、char32_t文字列リテラルは、ヌル終端を含む「n個のconst char32_tの配列」です。
- str=L "abcd";
- WideStringのリテラルで、WideStringリテラルは、ヌル終端を含む「n個のconst wchar_tの配列」です。
- str=R”abcd”;
- raw文字列です。
C++におけるL “”リテラル、U “”リテラル、u””リテラルのそれぞれの違いは何ですか?
- Lは、WideStringのリテラルに基づいており、コンパイラ/IDEオプションのn個のconst wchar_tの配列に依存します。一般的には、UTF-8またはUTF-16形式です。
- uは、UTF-16形式です。
- Uは、UTF-32形式です。
UnicodeStringの長さの取得
UnicodeString ustr = L"ABCDE";
int length=ustr.Length();
if(ustr.Length()>45) ShowMessage(L"Too Long");
UnicodeStringのサイズの取得
UnicodeString ustr=L"ABCDEF";
int size = ustr.Length()*ustr.ElementSize();
UnicodeString内の文字にアクセスする方法
UnicodeString ustr=L"ABCDEF";
Char Ch=ustr[3]; // Ch is 3rd C char in integer now
UnicodeStringの文字を変更する方法
ustr[3]=L'九'; //single unicode character
ustr[3]=L'/u1F603';
ustr[3]=128515;
UnicodeStringの文字の位置を調べる方法
UnicodeString ustr="Hey,Hello";
int pos=ustr.Pos(L"Hello");
if(ustr.Pos(L"Hello")>0) ShowMessage("Found Hello");
UnicodeStringを整数に変換する方法
UnicodeString ustr=L"987";
int i=ustr.ToInt();
int j=ustr.ToIntDef(0); // if not an integer then set to 0
UnicodeStringを浮動小数に変換する方法
UnicodeString ustr=L"8.45";
double i=ustr.ToDouble();
UnicodeStringの小文字変換
UnicodeString ustr=L"This is Unicode";
UnicodeString ustr2=ustr.LowerCase();
UnicodeStringの大文字変換
UnicodeString ustr=L"This is Unicode";
UnicodeString ustr2=ustr.UpperCase();
UnicodeStringをchar文字列に変換する
UnicodeString src=L" ABC DEF";
char *dest= ((AnsiString)src).c_str(); // we cant use c_str() of Unicode directly, we can use c_str() of AnsiString
// or this can be used in some compilers
System::UnicodeToUtf8( dest, 256, src, src.Length() );
低レベルの文字(char)に変換する必要がある場合、つまり低レベルの変数を高レベル(unicode)にする必要がある場合は、大きい数字の文字から小さい数字の文字に変換することはお勧めしません。そうしないと、一部のUnicode文字が失われ、文字列の中に欠落した文字や間違った文字が挿入される原因になります。
UnicodeStringをAnsiStringへ変換する
UnicodeString src=L"This is Unicode";
AnsiString dest= (AnsiString)src;
UnicodeStringをWideStringへ変換する
UnicodeString ustr=L"This is unicode";
WideChar wstr[255];
StrCopy(wstr, ustr.w_str());
UnicodeStringの部分文字列
UnicodeString ustr = L"ABCDEF";
UnicodeString ustr2= ustr.SubString(5, 3);
文字列をUnicodeStringに挿入する
UnicodeString ustr=L"ABCDEF";
ustr.Insert(L"-insert-", 3);
UnicodeStringの一部を削除/トリミングする
UnicodeString ustr = L"ABCDEF";
UnicodeString ustr2= ustr.Delete(2, 4); // UnicodeString& Delete(int index, int count)
UnicodeStringを比較する
UnicodeString ustr=L"ABCDEF";
UnicodeString ustr=L"AbCdEf";
if(ustr.Compare(ustr2)==0) ShowMessage("Sensitively Both Strings are Same "); // case-sensitive
if(ustr.CompareIC(ustr2)==0) ShowMessage("Insensitively Both Strings are Same "); // case-insensitive
UnicodeStringからスペースや制御文字をトリミングする
ustr=L" ABC DEF";
ustr2=ustr.Trim();
ここで紹介したUnicodeStringのメソッドやプロパティの詳細については、Embarcadero docwiki のUnicodeStringのメソッドとプロパティ 、そしてUnicodeStringの型をご参照ください。