文字列の中の特定の位置の文字が、全角文字か半角文字かを調べるには、AnsiString::ByteType()メソッドが使用できます。
AnsiString::ByteType()メソッドは、AnsiString内のindexで示されたバイトの位置にあるバイトの種類を示します。
AnsiString text = "abcあいうアイウ";
for (int i = 1; i <= text.Length(); ++i)
{
AnsiString s = IntToStr(i) + " ";
//switch (ByteType(text, i)) //Delphi互換のByteType()ルーチンも使えます
switch (text.ByteType(i))
{
case mbSingleByte: //1バイト文字
s += "1バイト文字";
break;
case mbLeadByte: //マルチバイト文字の最初のバイト
s += "マルチバイト文字の最初のバイト";
break;
case mbTrailByte: //マルチバイト文字の最後のバイト
s += "マルチバイト文字の最後のバイト";
break;
}
Memo1->Lines->Add(s);
}
結果は次のようになります。
1 1バイト文字
2 1バイト文字
3 1バイト文字
4 マルチバイト文字の最初のバイト
5 マルチバイト文字の最後のバイト
6 マルチバイト文字の最初のバイト
7 マルチバイト文字の最後のバイト
8 マルチバイト文字の最初のバイト
9 マルチバイト文字の最後のバイト
10 1バイト文字
11 1バイト文字
12 1バイト文字
マルチバイト文字の最初のバイトと最後のバイトのどちらであるかを調べるには、AnsiString::IsLeadByte()メソッドとAnsiString::IsTrailByte()メソッドを使います。
AnsiString::IsLeadByte()メソッドは、indexで示されるバイトがマルチバイト文字の最初のバイトの場合に true を返します。index で示されるバイトが最後のバイトの場合,またはマルチバイト文字の一部ではない場合,IsLeadByte は false を返します。
AnsiString::IsTrailByte()メソッドは、indexで示されるバイトがマルチバイト文字の後続バイトの場合に true を返します。index で示されるバイトが最初のバイトの場合,またはマルチバイト文字の一部ではない場合,IsTrailByte は false を返します。
AnsiString text = "abcあいうアイウ";
for (int i = 1; i <= text.Length(); ++i)
{
AnsiString s = IntToStr(i) + " ";
if (text.IsLeadByte(i)) {
s += "マルチバイト文字の最初のバイト";
}
else if (text.IsTrailByte(i))
{
s += "マルチバイト文字の最後のバイト";
}
else
{
s += "1バイト文字";
}
Memo1->Lines->Add(s);
}
結果は次のようになります。
1 1バイト文字
2 1バイト文字
3 1バイト文字
4 マルチバイト文字の最初のバイト
5 マルチバイト文字の最後のバイト
6 マルチバイト文字の最初のバイト
7 マルチバイト文字の最後のバイト
8 マルチバイト文字の最初のバイト
9 マルチバイト文字の最後のバイト
10 1バイト文字
11 1バイト文字
12 1バイト文字