MECSUtils リファレンス

 MECSUtils (http://cc.codegear.com/item/26061) は文字単位での文字列操作及び、文字エンコード変換を行うユニットで、Delphi 2007 / 2009 / 2010 に対応しています。

 Delphi 2007 (またはそれ以前) の SysUtils / StrUtils 名前空間にある類似関数は文字エンコード変換がサロゲートペアに対応しておらず、Delphi 2009(またはそれ以降) の AnsiStrings / SysUtils / StrUtils 名前空間にある類似関数はサロゲートペアを考慮した文字列操作に対応していません。

 Delphi 2007 / 2009 / 2010 で同名の関数を使って同等の処理可能にするのが MECSUtils です。

Codepage/CharSet/Locale ルーチン
名前 説明
CodePageToFontCharset コードページから TFont.CharSet を導き出します。
FontCharsetToCodePage TFont.CharSet からコードページを導き出します。
IsFarEastCharSet TFont.CharSet が東アジアのものかどうかを判定します。
IsFarEastLCID ロケール ID が東アジアのものかどうかを判定します。
 
AnsiString ルーチン
名前 説明
MecsGetCodePage AnsiString のコードページを取得します。
MecsGetLeadBytes マルチバイト AnsiString の LeadByte の一覧を取得します。
 
UnicodeString / WideString ルーチン
名前 説明
MecsEastAsianWidth 東アジアの文字幅を取得します。
MecsIsNormalized Unicode 文字列の標準化 (正規化) 種類を判定します。
MecsMappingFix_CP932ToUnicode いわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をインポート用に再マッピングします。
MecsMappingFix_JISX0208ToUnicode いわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をインポート用に再マッピングします。
MecsMappingFix_UnicodeToCP932 いわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をエクスポート用に再マッピングします。
MecsMappingFix_UnicodeToJISX0208 いわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をエクスポート用に再マッピングします。
MecsNormalize Unicode 文字列を標準化 (正規化) します。
StrLen 文字列内のヌルターミネータを除いた文字構成要素数を返します。
 
Common ルーチン
名前 説明
MecsCharLength 文字で使われるエレメント数を返します。
MecsCharToElementIndex 文字列内の指定された文字の最初のエレメントを 1 から始まるインデックスで返します。
MecsCharToElementLen 文字列の最初の MaxLen の文字の長さをエレメント数で返します。
MecsCopy 文字列の部分文字列を返します。
MecsDelete 文字列から部分文字列を削除します。
MecsElementToCharIndex 文字列内の指定されたエレメントを含む文字の位置を返します。
MecsElementToCharLen 文字列の最初の MaxLen エレメントに含まれている文字数を返します。
MecsElementType 文字列が 1 エレメントで 1 文字のエレメント, 2 エレメントで 1 文字の場合の最初のエレメント, 2 番目以降のエレメントのいずれであるかを示します。
MecsInsert 部分文字列を文字列の指定された位置に挿入します。
MecsIsFullWidth 文字が FULL_WIDTH であるかを判定します。
MecsIsLeadElement 文字列のエレメントが文字を構成する最初のエレメントであるかを示します。
MecsIsMECElement 文字列のエレメントが複数のエレメントで文字を構成するエレメントであるかを示します。
MecsIsTrailElement 文字列のエレメントが文字を構成する 2 番目以降のエレメントであるかを示します。
MecsLeftStr 文字列の最初に表示される指定された長さの部分文字列を返します。
MecsLength 文字列内の文字数を返します
MecsMidStr 文字列内の指定された部分に表示される、指定された長さの部分文字列を返します。
MecsNextCharIndex 次の文字のエレメントインデックスを返します。
MecsReverseString 指定した文字列の向きを逆にしたものを返します。
MecsRightStr 文字列の最後に表示される指定された長さの部分文字列を返します。
MecsStrCharLength 文字の長さをエレメント数で返します。
MecsStrElementType 文字列が 1 エレメントで 1 文字のエレメント, 2 エレメントで 1 文字の場合の最初のエレメント, 2 番目以降のエレメントのいずれであるかを示します。
MecsStrLen 文字列内のヌルターミネータを除いた文字数を返します。
MecsStrNextChar 次の文字を指すポインタを返します。
 
結合文字列 ルーチン
名前 説明
MecsCCSLength 結合文字列で使われるエレメント数を返します。
MecsCCSToElementIndex 結合文字を含む文字列内の指定された文字の最初のエレメントを 1 から始まるインデックスで返します。
MecsCCSToElementLen 結合文字を含む文字列の最初の MaxLen の文字の長さをエレメント数で返します。
MecsCombiningType 文字が 基底文字 / 結合文字 のどちらであるかを判断します。
MecsCopyC 結合文字を含む文字列の部分文字列を返します。
MecsDeleteC 結合文字を含む文字列から部分文字列を削除します。
MecsElementToCCSIndex 結合文字を含む文字列内の指定されたエレメントを含む文字の位置を返します。
MecsElementToCCSLen 結合文字を含む文字列の最初の MaxLen エレメントに含まれている文字数を返します。
MecsInsertC 部分文字列を結合文字を含む文字列の指定された位置に挿入します。
MecsLeftStrC 結合文字を含む文字列の最初に表示される指定された長さの部分文字列を返します。
MecsLengthC 結合文字を含む文字列内の文字数を返します
MecsMidStrC 結合文字を含む文字列内の指定された部分に表示される、指定された長さの部分文字列を返します。
MecsNextCCSIndex 次の文字のエレメントインデックスを返します。
MecsReverseStringC 指定した結合文字を含む文字列の向きを逆にしたものを返します。
MecsRightStrC 結合文字を含む文字列の最後に表示される指定された長さの部分文字列を返します。
MecsStrCCSLength 文字の長さをエレメント数で返します。
MecsStrLenC 結合文字を含む文字列内のヌルターミネータを除いた文字数を返します。
MecsStrNextCCS 次の文字を指すポインタを返します。
 
Convert ルーチン
名前 説明
AnsiToUTF32 Ansi 文字列を UTF-32 に変換します。
AnsiToUTF16 Ansi 文字列を UTF-16 (Unicode) に変換します。
AnsiToUTF8 Ansi 文字列を UTF-8 に変換します。
CodePointToUTF16 Unicode のコードポイントから UTF-16 (Unicode) へ変換します。
CodePointToUTF8 Unicode のコードポイントから UTF-8 へ変換します。
ConvertMultiByteToUnicode Ansi 文字列を Unicode (UTF-16) へ変換します。
ConvertString Ansi 文字列を他のコードページの Ansi へ変換します。
ConvertUnicodeToMultiByte Unicode (UTF-16) 文字列を Ansi へ変換します。
UTF32ToAnsi UTF-32 文字列を Ansi へ変換します。
UTF32ToUTF16 UTF-32 文字列を UTF-16 (Unicode) へ変換します。
UTF32ToUTF8 UTF-32 文字列を UTF-8 へ変換します。
UTF16ToAnsi UTF-16 (Unicode) 文字列を Ansi へ変換します。
UTF16ToUTF32 UTF-16 (Unicode) 文字列を UTF-32 へ変換します。
UTF16ToUTF8 UTF-16 (Unicode) 文字列を UTF-8 へ変換します。
UTF8ToAnsi UTF-8 文字列を Ansi へ変換します。
UTF8ToUTF32 UTF-8 文字列を UTF-32 へ変換します。
UTF8ToUTF16 UTF-8 文字列を UTF-16 (Unicode) へ変換します。
 

CodePageToFontCharset 関数

CodePageToFontCharset 関数はコードページから TFont.CharSet を導き出します。
 
分野の指定
Codepage/CharSet/Locale ルーチン
 
Delphi の構文:
  function CodePageToFontCharset(CodePage: DWORD): TFontCharset;
 
説明:
  CodePageToFontCharset 関数はコードページから TFont.CharSet を導き出します。CodePage で指定したコードページから、対応すると思われる TFont.CharSet を返します。

FontCharsetToCodePage 関数

FontCharsetToCodePage 関数は TFont.CharSet からコードページを導き出します。
 
分野の指定
Codepage/CharSet/Locale ルーチン
 
Delphi の構文:
  function FontCharsetToCodePage(FontCharset: TFontCharset): DWORD;
 
説明:
  FontCharsetToCodePage 関数は TFont.CharSet からコードページを導き出します。FontCharset で指定した TFont.CharSet から、対応すると思われるコードページを返します。

IsFarEastCharSet 関数

IsFarEastCharSet 関数は TFont.CharSet が東アジアのものかどうかを判定します。
 
分野の指定
Codepage/CharSet/Locale ルーチン
 
Delphi の構文:
  function IsFarEastCharSet(CharSet: TFontCharSet): Boolean;
 
説明:
  IsFarEastCharSet 関数は TFont.CharSet が東アジアのものかどうかを判定します。戻り値を MecsIsFullWidth 関数に設定する事で、TFont.CharSet から文字幅の計算を行う事ができます。

IsFarEastLCID 関数

IsFarEastLCID 関数はロケール ID が東アジアのものかどうかを判定します。
 
分野の指定
Codepage/CharSet/Locale ルーチン
 
Delphi の構文:
  function IsFarEastLCID(Locale: LCID): Boolean;
 
説明:
  IsFarEastLCID 関数はロケール ID が東アジアのものかどうかを判定します。戻り値を MecsIsFullWidth 関数に設定する事で、ロケール ID から文字幅の計算を行う事ができます。
 
  IsFarEastLCID 関数は Locale が 香港 (LCID=3076) や シンガポール (LCID=4100) の場合にも True を返します。東アジアという地域としては正しいのですが、これらの地域では公用語が一つではないため、MecsIsFullWidthへ渡す値としては必ずしも正しいとは限りません。

MecsGetCodePage 関数

MecsGetCodePage 関数は AnsiString のコードページを取得します。
 
分野の指定
AnsiString ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsGetCodePage(S: RawByteString): DWORD;
 
Delphi 2007 の構文:
  function MecsGetCodePage(S: AnsiString): DWORD;
 
説明:
  MecsGetCodePage 関数は AnsiString のコードページを取得します。Delphi 2009 / 2010 では、AnsiString のコードページを取得します。Delphi 2007 では MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が返ります。
 
  MecsGetCodePage 関数は AnsiString を扱う関数のデフォルトコードページを特定するのに利用されます。直接呼び出す事はあまりないかもしれません。

MecsGetLeadBytes 関数

MecsGetLeadBytes 関数はマルチバイト AnsiString の LeadByte の一覧を取得します。
 
分野の指定
AnsiString ルーチン
 
Delphi の構文:
  function MecsGetLeadBytes: TLeadBytes;
  function MecsGetLeadBytes(CodePage: DWORD): TLeadBytes;
 
説明:
  MecsGetLeadBytes 関数はマルチバイト AnsiString の LeadByte を取得します。LeadByte とはマルチバイト文字の最初の要素 (第 1 バイト目) の事です。マルチバイト文字の 2 番目以降の要素は TrailByte と呼ばれます。in 演算子、または CharInSet 関数でエレメント (文字構成要素) が LeadByte に該当するかどうかを知ることができます。
 
  2 番目の構文を使うと、コードページを強制する事ができます。コードページを指定しなかった場合には、MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。

MecsEastAsianWidth 関数

MecsEastAsianWidth 関数は東アジアの文字幅を取得します。
 
分野の指定
UnicodeString / WideString ルーチン
 
Delphi の構文:
function MecsEastAsianWidth(U: UCS4Char): TEastAsianWidth;
 
説明:
  MecsEastAsianWidth 関数は東アジアの文字幅を取得します。U に指定した Unicode コードポイントで表される文字の文字幅を取得します。戻り値は以下のようになります。
 
TEastAsianWidth 説明
eawNeutral ニュートラル。東アジアの文字列には通常含まれない。
全角サイズでも半角サイズでもない。
eawFullwidth いわゆる全角文字。
eawHalfwidth いわゆる半角文字。
eawWide これもいわゆる全角文字。
eawNarrow これもいわゆる半角文字。
eawAmbiguous 曖昧。東アジアではこの属性の文字は通常、いわゆる全角文字として扱う。
その他の地域ではいわゆる半角文字として扱う。
 
  東アジアに於いては eawFullwidth / eawWide / eawAmbiguous 属性を持つ Unicode 文字はいわゆる全角文字として扱う必要があります。マルチバイト Ansi で言う所の全角と半角を判断するには MecsIsFullWidth 関数を利用します。
 
関連情報:

MecsIsNormalized 関数

MecsIsNormalized 関数は Unicode 文字列の標準化 (正規化) 種類を判定します。
 
分野の指定
UnicodeString / WideString ルーチン
 
Delphi の構文:
  function MecsIsNormalized(const AText: WideString; NormForm: TNORM_FORM): Boolean;
 
説明:
  MecsIsNormalized 関数は Unicode 文字列の標準化 (正規化) 種類を判定します。AText に指定された Unicode 文字列が標準化 (正規化) されていれば True , されていなければ False を返します。標準化 (正規化) されている場合には NormForm に標準化 (正規化) の種類が返ります。標準化 (正規化) の種類については以下を参照してください。
 
TNORM_FORM 説明
NormalizationOther その他の標準化 (正規化) 方法。
NormalizationC Normalization Form Canonical Composition (NFC)
NormalizationD Normalization Form Canonical Decomposition (NFD)
NormalizationKC Normalization Form Compatibility Composition (NFKC)
NormalizationKD Normalization Form Compatibility Decomposition (NFKD)
 
注意:
  MecsIsNormalize 関数を利用する場合、XP / Serever 2003 では"Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1" または Internet Explorer 7.0 以上が必要となります。Vista 以降の OS で特に必要とするものはありません。
 
関連情報:

MecsMappingFix_CP932ToUnicode 関数

いわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をインポート用に再マッピングします。
 
分野の指定
UnicodeString / WideString ルーチン
 
Delphi 2009 / 2010 の構文:
function MecsMappingFix_CP932ToUnicode(const S: UnicodeString): UnicodeString;
function MecsMappingFix_CP932ToUnicode(const S: WideString): WideString;
 
Delphi 2007 の構文:
function MecsMappingFix_CP932ToUnicode(const S: WideString): WideString;
 
説明:
  MecsMappingFix_CP932ToUnicode 関数はいわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をインポート用に再マッピングします。S に指定された Unicode 文字列に含まれる、"ANSI -> Unicode 変換後に CP932 非互換となる文字" を "変換後に CP932 互換となる文字" へ再マッピングします。
 
インポート (CP932 文字) 変換前 変換後 (CP932 互換文字)
― (1-17:0x8150) — (U+2014: HORIZONTAL BAR) ― (U+2015: EM DASH)
 ̄ (1-29:0x815C) ‾ (U+203E: OVERLINE)  ̄ (U+FFE3: FULLWIDTH MACRON)
 
  CP932 (Shift-JIS) から UnicodeString / WideString にコンバートした後にこの関数を通して、変換された文字列が CP932 (Shift-JIS) 収録文字のみで構成されるように再マッピングする事が可能です。
 
// Delphi 2009 / 2010 での例
// (SJIS.TXT は Shift-JIS のファイル)
var
  SL: TStringList;
  Enc: TEncoding;
begin
  SL := TstringList.Create;
  Enc := TEncoding.GetEncoding(932);
  try
    SL.LoadFromFile('C:\SJIS.TXT', Enc);
    ShowMessage(SL.Text);                                 // CP932 非互換文字へマッピングされる
    SL.Text := MecsMappingFix_CP932ToUnicode(SL.Text);
    ShowMessage(SL.Text);                                 // CP932 互換文字へマッピングされる
  finally
    Enc.Free;
    SL.Free;
  end;
end;

  関連情報:

MecsMappingFix_JISX0208ToUnicode 関数

いわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をインポート用に再マッピングします。
 
分野の指定
UnicodeString / WideString ルーチン
 
Delphi 2009 / 2010 の構文:
function MecsMappingFix_JISX0208ToUnicode(const S: UnicodeString): UnicodeString;
function MecsMappingFix_JISX0208ToUnicode(const S: WideString): WideString;
 
Delphi 2007 の構文:
function MecsMappingFix_JISX0208ToUnicode(const S: WideString): WideString;
 
説明:
  MecsMappingFix_JISX0208ToUnicode 関数はいわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をインポート用に再マッピングします。S に指定された Unicode 文字列に含まれる、"ANSI -> Unicode 変換後に JIS X 0208 非互換となる文字" を "変換後に JIS X 0208 互換となる文字" へ再マッピングします。
 
インポート (JIS X 0208 文字) 変換前 変換後 (JIS X 0208 互換文字)
― (1-17:0x8150) — (U+2014: HORIZONTAL BAR) ― (U+2015: EM DASH)
 ̄ (1-29:0x815C) ‾ (U+203E: OVERLINE)  ̄ (U+FFE3: FULLWIDTH MACRON)
∥ (1-34:0x8161) ‖ (U+2016: DOUBLE VERTICAL LINE) ∥ (U+2225: PARALLEL TO)
- (1-61:0x817C) − (U+2212: MINUS SIGN) - (U+FF0D: FULLWIDTH HYPHEN-MINUS)
~ (1-33:0x8160) 〜 (U+301C: WAVE DASH) ~ (U+FF5E: FULLWIDTH TILDE)
¢ (1-81:0x8191) ¢ (U+00A2: CENT SIGN) ¢ (U+FFE0: FULLWIDTH CENT SIGN)
£ (1-82:0x8192) £ (U+00A3: POUND SIGN) £ (U+FFE1: FULLWIDTH POUND SIGN)
¬ (2-44:0x81CA) ¬ (U+00AC: NOT SIGN) ¬ (U+FFE2: FULLWIDTH NOT SIGN)
 
  JIS-Code (ISO2020-JP) や EUC-JP から UnicodeString / WideString にコンバートした後にこの関数を通して、変換された文字列が JIS X 0208 収録文字のみで構成されるように再マッピングする事が可能です。
 
// Delphi 2009 / 2010 での例
// (JISX0208.TXT は JisCode のファイル)
var
  SL: TStringList;
  Enc: TEncoding;
begin
  SL := TstringList.Create;
  Enc := TEncoding.GetEncoding(50220);
  try
    SL.LoadFromFile('C:\JISX0208.TXT', Enc);
    ShowMessage(SL.Text);                                 // JIS X 0208 非互換文字へマッピングされる
    SL.Text := MECSMappingFix_JISX0208ToUnicode(SL.Text);
    ShowMessage(SL.Text);                                 // JIS X 0208 互換文字へマッピングされる
  finally
    Enc.Free;
    SL.Free;
  end;
end;

  関連情報:

MecsMappingFix_UnicodeToCP932 関数

いわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をエクスポート用に再マッピングします。
 
分野の指定
UnicodeString / WideString ルーチン
 
Delphi 2009 / 2010 の構文:
function MecsMappingFix_UnicodeToCP932(const S: UnicodeString): UnicodeString;
function MecsMappingFix_UnicodeToCP932(const S: WideString): WideString;
 
Delphi 2007 の構文:
function MecsMappingFix_UnicodeToCP932(const S: WideString): WideString;
 
説明:
  MecsMappingFix_UnicodeToCP932 関数はいわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をエクスポート用に再マッピングします。S に指定された文字列に含まれる、"Unicode -> ANSI 変換後に CP932 非互換となる文字" を "変換後に CP932 互換となる文字" へ再マッピングします。
 
変換前 変換後 (CP932 互換文字) エクスポート (CP932 文字)
— (U+2014: HORIZONTAL BAR) ― (U+2015: EM DASH) ― (1-17:0x8150)
‾ (U+203E: OVERLINE)  ̄ (U+FFE3: FULLWIDTH MACRON)  ̄ (1-29:0x815C)
 
  UnicodeString / WideString を CP932 (Shift-JIS) にコンバートする前にこの関数を通して、変換する文字列が文字化けしないように再マッピングする事が可能です。
 
// Delphi 2009 / 2010 での例
var
  SL: TStringList;
  Enc: TEncoding;
  S: UnicodeString;
begin
  SL := TstringList.Create;
  Enc := TEncoding.GetEncoding(932);
  try
    S := #$2014#$203E;
    SL.Text := S;
    SL.SaveToFile('C:\UNICODE1.TXT', Enc);                // 文字化けする
    SL.Text := MecsMappingFix_UnicodeToCP932(S);
    SL.SaveToFile('C:\UNICODE2.TXT', Enc);                // 文字化けしない
  finally
    Enc.Free;
    SL.Free;
  end;
end;

  関連情報:

MecsMappingFix_UnicodeToJISX0208 関数

いわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をエクスポート用に再マッピングします。
 
<!> この関数は以前、MECSMappingFixJA() という名称でリリースされていました <!>
 
分野の指定
UnicodeString / WideString ルーチン
 
Delphi 2009 / 2010 の構文:
function MecsMappingFix_UnicodeToJISX0208(const S: UnicodeString): UnicodeString;
function MecsMappingFix_UnicodeToJISX0208(const S: WideString): WideString;
 
Delphi 2007 の構文:
function MecsMappingFix_UnicodeToJISX0208(const S: WideString): WideString;
 
説明:
  MecsMappingFix_UnicodeToJISX0208 関数はいわゆる "全角チルダ / 波ダッシュ問題" を引き起こす文字をエクスポート用に再マッピングします。S に指定された文字列に含まれる、"Unicode -> ANSI 変換後に JIS X 0208 非互換となる文字" を "変換後に JIS X 0208 互換となる文字" へ再マッピングします。
 
変換前 (JIS X 0208 互換文字) 変換後 エクスポート (JIS X 0208 文字)
— (U+2014: HORIZONTAL BAR) ― (U+2015: EM DASH) — (1-17:0x8150)
‾ (U+203E: OVERLINE)  ̄ (U+FFE3: FULLWIDTH MACRON) ‾ (1-29:0x815C)
∥ (U+2225: PARALLEL TO) ‖ (U+2016: DOUBLE VERTICAL LINE) ∥ (1-34:0x8161)
- (U+FF0D: FULLWIDTH HYPHEN-MINUS) − (U+2212: MINUS SIGN) - (1-61:0x817C)
~ (U+FF5E: FULLWIDTH TILDE) 〜 (U+301C: WAVE DASH) ~ (1-33:0x8160)
¢ (U+FFE0: FULLWIDTH CENT SIGN) ¢ (U+00A2: CENT SIGN) ¢ (1-81:0x8191)
£ (U+FFE1: FULLWIDTH POUND SIGN) £ (U+00A3: POUND SIGN) £ (1-82:0x8192)
¬ (U+FFE2: FULLWIDTH NOT SIGN) ¬ (U+00AC: NOT SIGN) ¬ (2-44:0x81CA)
 
  UnicodeString / WideString を JIS-Code (ISO2020-JP) や EUC-JP にコンバートする前にこの関数を通して、変換する文字列が文字化けしないように再マッピングする事が可能です。
 
// Delphi 2009 / 2010 での例
var
  SL: TStringList;
  Enc: TEncoding;
  S: UnicodeString;
begin
  SL := TstringList.Create;
  Enc := TEncoding.GetEncoding(50220);
  try
    S := #$2014#$203E#$2225#$FF0D#$FF5E#$FFE0#$FFE1#$FFE2;
    SL.Text := S;
    SL.SaveToFile('C:\UNICODE1.TXT', Enc);                // 文字化けする
    SL.Text := MECSMappingFix_UnicodeToJISX0208(S);
    SL.SaveToFile('C:\UNICODE2.TXT', Enc);                // 文字化けしない
  finally
    Enc.Free;
    SL.Free;
  end;
end;

  関連情報:

MecsNormalize 関数

MecsNormalize 関数は Unicode 文字列を標準化 (正規化) します。
 
分野の指定
UnicodeString / WideString ルーチン
 
Delphi の構文:
function MecsNormalize(const Src: WideString; var Dst: WideString; NormForm: TNORM_FORM): Boolean;
 
説明:
  MecsNormalize 関数は Unicode 文字列を標準化 (正規化) します。Src に指定された Unicode 文字列を NormForm で指定した方法で標準化 (正規化) し、Dst に格納します。標準化 (正規化) に成功した場合には戻り値に True , 失敗した場合には False が返ります。標準化 (正規化) の種類については以下を参照してください。
 
TNORM_FORM 説明
NormalizationOther その他の標準化 (正規化) 方法。
NormalizationC Normalization Form Canonical Composition (NFC)
NormalizationD Normalization Form Canonical Decomposition (NFD)
NormalizationKC Normalization Form Compatibility Composition (NFKC)
NormalizationKD Normalization Form Compatibility Decomposition (NFKD)
 
注意:
  MecsNormalize 関数を利用する場合、  上記条件に該当しない場合で、OS が NT 3.1 以降の場合には代替手段を使って標準化 (正規化) が行われます。
 
  Unicode には 結合文字列 / 合成文字 の問題があるため、文字列の比較や検索には標準化 (正規化) を前処理として行わなくてはならない場合があります。詳しくは関連情報をご覧下さい。
 
関連情報:

StrLen 関数 (Delphi 2007 専用)

StrLen 関数は文字列内のヌルターミネータを除いた文字構成要素数を返します。
 
分野の指定
UnicodeString / WideString ルーチン
 
Delphi 2007 の構文:
  function StrLen(const Str: PWideChar): Cardinal;
 
説明:
  StrLen 関数は文字列内のヌルターミネータを除いた文字構成要素数を返します。Delphi 2009 / 2010 には SysUtils 名前空間に PWideChar 用の StrLen 関数が存在するのですが、Delphi 2007 には存在しません。この差異を補うための Delphi 2007 専用関数となっています。
 
関連情報:

MecsCharLength 関数

MecsCharLength 関数は文字で使われるエレメント数を返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsCharLength(const S: RawByteString; Index: Integer): Integer;
  function MecsCharLength(const S: RawByteString; Index: Integer; CodePage: DWORD): Integer;
  function MecsCharLength(const S: UnicodeString; Index: Integer): Integer;
  function MecsCharLength(const S: WideString; Index: Integer): Integer;

Delphi 2007 の構文:
  function MecsCharLength(const S: AnsiString; Index: Integer): Integer;
  function MecsCharLength(const S: AnsiString; Index: Integer; CodePage: DWORD): Integer;
  function MecsCharLength(const S: WideString; Index: Integer): Integer;

説明:
  MecsCharLength 関数を呼び出すと、S の Index 位置にある文字のサイズがエレメント単位でわかります。エレメントは文字を構成する要素で、AnsiString なら AnsiChar、UnicodeString / WideString なら WideChar となります。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の CharLength に相当する機能です。

サンプルコード:

AnsiString(CP932)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字 A B C D
バイナリ 0x41 0x42 0x82 0xA0 0x82 0xA2 0x82 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  // CharLength の引数 Index は文字インデックスではなくエレメントインデックス
  Idx := CharLength(A, 3);     // 2
  ShowMessage(IntToStr(Idx));
  Idx := CharLength(A, 4);     // 1
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharLength(A, 3); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharLength(A, 4); // 2
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  A: AnsiString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  // CharLength の引数 Index は文字インデックスではなくエレメントインデックス
  Idx := CharLength(A, 3);          // 2
  ShowMessage(IntToStr(Idx));
  Idx := CharLength(A, 4);          // 1
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharLength(A, 3932); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharLength(A, 4932); // 2
  ShowMessage(IntToStr(Idx));
end;

UnicodeString / WideString
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8
文字 A B 𠮷 C D
バイナリ 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x0043 0x0044

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋CD';

  // CharLength の引数 Index は文字インデックスではなくエレメントインデックス
  Idx := CharLength(U, 3);     // 4 (エレメント単位ではなくバイト単位)
  ShowMessage(IntToStr(Idx));
  Idx := CharLength(U, 4);     // 2 (エレメント単位ではなくバイト単位)
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharLength(U, 3); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharLength(U, 4); // 1
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7  + '野屋CD';

  Idx := MecsCharLength(W, 3); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharLength(W, 4); // 1
  ShowMessage(IntToStr(Idx));
end;

UTF8String(CP_UTF8/CP65001)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10 11 12 13 14
文字 A B 𠮷 C D
バイナリ 0x41 0x42 0xF0 0xA0 0xAE 0xB7 0xE9 0x87 0x8E 0xE5 0xB1 0x8B 0x43 0x44

// Delphi 2009 / 2010 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$20BB7 + '野屋CD';

  // CharLength の引数 Index は文字インデックスではなくエレメントインデックス
  Idx := AnsiStrings.CharLength(U8, 3); // 1 (NG)
  ShowMessage(IntToStr(Idx));
  Idx := AnsiStrings.CharLength(U8, 4); // 1 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharLength(U8, 3);         // 4
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharLength(U8, 4);         // 3
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$20BB7 + '野屋CD';

  // CharLength の引数 Index は文字インデックスではなくエレメントインデックス
  Idx := CharLength(U8, 3);     // 1 (NG)
  ShowMessage(IntToStr(Idx));
  Idx := CharLength(U8, 4);     // 1 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharLength(U8, 3); // 4
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharLength(U8, 4); // 3
  ShowMessage(IntToStr(Idx));
end;

  RTL の CharLength は不思議な仕様になっています。まず、Unicode 版はエレメント数ではなく何故かバイト数を返します (ヘルプを読む限りではこれが正しい動作のようですが、エレメント数を返す関数がありません)。更に言えば、Delphi 2009 / 2010 では CharLength (AnsiString 版) が AnsiStrings 名前空間と SysUtils 名前空間に重複して存在します (オーバーロードされたものではありません)。 そのため、AnsiStrings を uses していると"E2251 'CharLength' へのオーバーロード呼び出しはあいまいです"が発生してしまいます。このような場合には、"AnsiStrings.CharLength"のように名前空間を明示する必要があります。

  CharLength でエレメント単位の長さを知りたい場合には以下のようにします。

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋CD';

  // CharLength の引数 Index は文字インデックスではなくエレメントインデックス
  Idx := CharLength(U, 3div StringElementSize(U); // 2 (エレメント単位)
  ShowMessage(IntToStr(Idx));
  Idx := CharLength(U, 4div StringElementSize(U); // 1 (エレメント単位)
  ShowMessage(IntToStr(Idx));
end;

  逆に MecsCharLength でバイト単位の長さを知りたい場合には以下のようにします。

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋CD';

  Idx := MecsCharLength(U, 3) * StringElementSize(U); // 4 (バイト単位)
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharLength(U, 4) * StringElementSize(U); // 2 (バイト単位)
  ShowMessage(IntToStr(Idx));
end;


MecsCharToElementIndex 関数

MecsCharToElementIndex 関数は文字列内の指定された文字の最初のエレメントを 1 から始まるインデックスで返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsCharToElementIndex(const S: RawByteString; Index: Integer): Integer;
  function MecsCharToElementIndex(const S: RawByteString; Index: Integer; CodePage: DWORD): Integer;
  function MecsCharToElementIndex(const S: UnicodeString; Index: Integer): Integer;
  function MecsCharToElementIndex(const S: WideString; Index: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsCharToElementIndex(const S: AnsiString; Index: Integer): Integer;
  function MecsCharToElementIndex(const S: AnsiString; Index: Integer; CodePage: DWORD): Integer;
  function MecsCharToElementIndex(const S: WideString; Index: Integer): Integer;
 
説明:
  MecsCharToElementIndex 関数を呼び出すと、文字列 S の指定された位置にある文字のエレメントオフセットを取得できます。1 は最初の文字、2 は 2 番目の文字を指定します。 MecsCharToElementIndex は、Index が範囲外の場合 (Index <= 0 または S の文字数が Index より小さい) にゼロを返します。Index パラメータが UTF-16 のサロゲートペア や 結合文字 を示す場合、 MecsCharToElementIndex は最初のエレメントのオフセットを返します。
 
  端的に言えば、MecsCharToElementIndex は文字インデックスから、文字の先頭に位置するエレメントのインデックスを取得する関数です。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の CharToByteIndex / CharToElementIndex (Delphi 2009 / 2010) に相当する機能です。

サンプルコード:

AnsiString(CP932)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字 A B C D
バイナリ 0x41 0x42 0x82 0xA0 0x82 0xA2 0x82 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  Idx := CharToElementIndex(A, 3);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := CharToElementIndex(A, 4);     // 5
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementIndex(A, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementIndex(A, 4); // 5
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  A: AnsiString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  Idx := CharToByteIndex(A, 3);             // 3
  ShowMessage(IntToStr(Idx));
  Idx := CharToByteIndex(A, 4);             // 5
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementIndex(A, 3932); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementIndex(A, 4932); // 5
  ShowMessage(IntToStr(Idx));
end;

UnicodeString / WideString
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8
文字 A B 𠮷 C D
バイナリ 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x0043 0x0044

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋CD';

  Idx := CharToElementIndex(U, 3);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := CharToElementIndex(U, 4);     // 5
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementIndex(U, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementIndex(U, 4); // 5
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7  + '野屋CD';

  {$IFDEF UNICODE}
  Idx := CharToElementIndex(W, 3);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := CharToElementIndex(W, 4);     // 5
  ShowMessage(IntToStr(Idx));
  {$ELSE}
  // Delphi 2007 の CharToByteIndex() に WideString 版はない
  // Delphi 2007 に CharToElementIndex() はない
  {$ENDIF}

  Idx := MecsCharToElementIndex(W, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementIndex(W, 4); // 5
  ShowMessage(IntToStr(Idx));
end;

UTF8String(CP_UTF8/CP65001)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10 11 12 13 14
文字 A B 𠮷 C D
バイナリ 0x41 0x42 0xF0 0xA0 0xAE 0xB7 0xE9 0x87 0x8E 0xE5 0xB1 0x8B 0x43 0x44

// Delphi 2009 / 2010 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$20BB7 + '野屋CD';

  Idx := CharToElementIndex(U8, 3);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := CharToElementIndex(U8, 4);     // 4 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementIndex(U8, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementIndex(U8, 4); // 7
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';

  Idx := CharToByteIndex(U8, 3);                 // 3
  ShowMessage(IntToStr(Idx));
  Idx := CharToByteIndex(U8, 4);                 // 5 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementIndex(U8, 3, CP_UTF8); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementIndex(U8, 4, CP_UTF8); // 7
  ShowMessage(IntToStr(Idx));
end;


MecsCharToElementLen 関数

MecsCharToElementLen 関数は文字列の最初の MaxLen の文字の長さをエレメント数で返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsCharToElementLen(const S: RawByteString; MaxLen: Integer): Integer;
  function MecsCharToElementLen(const S: RawByteString; MaxLen: Integer; CodePage: DWORD): Integer;
  function MecsCharToElementLen(const S: UnicodeString; MaxLen: Integer): Integer;
  function MecsCharToElementLen(const S: WideString; MaxLen: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsCharToElementLen(const S: AnsiString; MaxLen: Integer): Integer;
  function MecsCharToElementLen(const S: AnsiString; MaxLen: Integer; CodePage: DWORD): Integer;
  function MecsCharToElementLen(const S: WideString; MaxLen: Integer): Integer;
 
説明:
  MecsCharToElementLen 関数を呼び出すと、文字列の文字単位の長さをそれに対応するエレメント単位の長さに変換できます。MecsCharToElementLen は、S の最初の MaxLen 数の文字で必要なエレメント数を返します。S が MaxLen より小さい場合、CharToByteLen は S の長さをエレメント数で返します。
 
  端的に言えば、MecsCharToElementLen は文字インデックスから、文字の最後に位置するエレメントのインデックス...つまり、文字単位で考えて"キリのいいエレメント数"を取得する関数です。エレメントを文字単位で区切って処理する際に利用します。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の CharToByteLen / CharToElementLen (Delphi 2009 / 2010) に相当する機能です。

サンプルコード:

AnsiString(CP932)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字 A B C D
バイナリ 0x41 0x42 0x82 0xA0 0x82 0xA2 0x82 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  Idx := CharToElementLen(A, 3);     // 4
  ShowMessage(IntToStr(Idx));
  Idx := CharToElementLen(A, 4);     // 6
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementLen(A, 3); // 4
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementLen(A, 4); // 6
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  A: AnsiString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  Idx := CharToByteLen(A, 3);             // 4
  ShowMessage(IntToStr(Idx));
  Idx := CharToByteLen(A, 4);             // 6
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementLen(A, 3932); // 4
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementLen(A, 4932); // 6
  ShowMessage(IntToStr(Idx));
end;

UnicodeString / WideString
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8
文字 A B 𠮷 C D
バイナリ 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x0043 0x0044

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋CD';

  Idx := CharToElementLen(U, 3);     // 4
  ShowMessage(IntToStr(Idx));
  Idx := CharToElementLen(U, 4);     // 5
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementLen(U, 3); // 4
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementLen(U, 4); // 5
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7  + '野屋CD';

  {$IFDEF UNICODE}
  Idx := CharToElementLen(W, 3);     // 4
  ShowMessage(IntToStr(Idx));
  Idx := CharToElementLen(W, 4);     // 5
  ShowMessage(IntToStr(Idx));
  {$ELSE}
  // Delphi 2007 の CharToByteLen() に WideString 版はない
  // Delphi 2007 に CharToElementLen() はない
  {$ENDIF}

  Idx := MecsCharToElementLen(W, 3); // 4
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementLen(W, 4); // 5
  ShowMessage(IntToStr(Idx));
end;

UTF8String(CP_UTF8/CP65001)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10 11 12 13 14
文字 A B 𠮷 C D
バイナリ 0x41 0x42 0xF0 0xA0 0xAE 0xB7 0xE9 0x87 0x8E 0xE5 0xB1 0x8B 0x43 0x44

// Delphi 2009 / 2010 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$20BB7 + '野屋CD';

  Idx := CharToElementLen(U8, 3);     // 3 (NG)
  ShowMessage(IntToStr(Idx));
  Idx := CharToElementLen(U8, 4);     // 4 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementLen(U8, 3); // 6
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementLen(U8, 4); // 9
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';

  Idx := CharToByteLen(U8, 3);                 // 4 (NG)
  ShowMessage(IntToStr(Idx));
  Idx := CharToByteLen(U8, 4);                 // 5 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsCharToElementLen(U8, 3, CP_UTF8); // 6
  ShowMessage(IntToStr(Idx));
  Idx := MecsCharToElementLen(U8, 4, CP_UTF8); // 9
  ShowMessage(IntToStr(Idx));
end;


MecsCopy 関数

MecsCopy 関数は文字列の部分文字列を返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsCopy(const S: RawByteString; Index, Count: Integer): RawByteString;
  function MecsCopy(const S: RawByteString; Index, Count: Integer; CodePage: DWORD): RawByteString;
  function MecsCopy(const S: UnicodeString; Index, Count: Integer): UnicodeString;
  function MecsCopy(const S: WideString; Index, Count: Integer): WideString;
 
Delphi 2007 の構文:
  function MecsCopy(const S: AnsiString; Index, Count: Integer): AnsiString;
  function MecsCopy(const S: AnsiString; Index, Count: Integer; CodePage: DWORD): AnsiString;
  function MecsCopy(const S: WideString; Index, Count: Integer): WideString;
 
説明:
  MecsCopy 関数は文字列の部分文字列を返します。S は、文字列型の式です。Index と Count は整数型の式です。MecsCopy 関数は、S の Index 文字目から Count 個の文字の入った部分文字列を返します。
 
  Index が S より長い場合、MecsCopy は空の文字列を返します。
 
  コピーできる文字より多い値が Count に指定されている場合、S の Index 文字目 から S の終わりまでの文字が返されます。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の Copy に相当する機能ですが、動的配列はサポートしません。また、Index と Count はマルチバイト (AnsiString 版)、サロゲートペア (UnicodeString / WideString 版) を考慮した"文字数"を指定します。

MecsDelete 手続き

MecsDelete 手続きは文字列から部分文字列を削除します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  procedure MecsDelete(var S: RawByteString; Index, Count: Integer);
  procedure MecsDelete(var S: RawByteString; Index, Count: Integer; CodePage: DWORD);
  procedure MecsDelete(var S: UnicodeString; Index, Count: Integer);
  procedure MecsDelete(var S: WideString; Index, Count: Integer);
 
Delphi 2007 の構文:
  procedure MecsDelete(var S: AnsiString; Index, Count: Integer);
  procedure MecsDelete(var S: AnsiString; Index, Count: Integer; CodePage: DWORD);
  procedure MecsDelete(var S: WideString; Index, Count: Integer);
 
説明:
  MecsDelete 手続きは、文字列 S の Index 文字目から始まる Count 個の文字の部分文字列を削除します。S は文字列型の変数です。Index と Count は整数型の式です。
 
  index が文字列の長さより大きい場合、または 1 未満の場合は、削除は行われません。
 
  count が index 以降の文字数より大きい場合、MecsDelete は終わりまでのすべての文字を削除します。count が 0 以下の場合は、削除は行われません。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の Delete に相当する機能です。Index と Count はマルチバイト (AnsiString 版)、サロゲートペア (UnicodeString / WideString 版) を考慮した"文字数"を指定します。

MecsElementToCharIndex 関数

MecsElementToCharIndex 関数は文字列内の指定されたエレメントを含む文字の位置を返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsElementToCharIndex(const S: RawByteString; Index: Integer): Integer;
  function MecsElementToCharIndex(const S: RawByteString; Index: Integer; CodePage: DWORD): Integer;
  function MecsElementToCharIndex(const S: UnicodeString; Index: Integer): Integer;
  function MecsElementToCharIndex(const S: WideString; Index: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsElementToCharIndex(const S: AnsiString; Index: Integer): Integer;
  function MecsElementToCharIndex(const S: AnsiString; Index: Integer; CodePage: DWORD): Integer;
  function MecsElementToCharIndex(const S: WideString; Index: Integer): Integer;
 
説明:
  MecsElementToCharIndex 関数を呼び出すと、文字列内で特定のエレメントを含んでいる文字がわかります。1 は最初のエレメント、2 は 2 番目のエレメントを指定します。Index パラメータが 文字列変数にないエレメントを指定する場合 (Index < 0 または Index > Length(S)) 、MecsElementToCharIndex は 0 を返します。
 
  AnsiString 版において、マルチバイト文字セット (MBCS) を使わない環境では、MecsElementToCharIndex は単純に Index の値を返します。なぜなら、エレメントと文字に 1 対 1 の対応があるからです。それ以外の場合、MecsElementToCharIndex は文字の位置を返します。1 は最初の文字、2 は 2 番目の文字を示します。
 
  UnicodeString / WideString 版において、サロゲートペアを使わない環境では、MecsElementToCharIndex は単純に Index の値を返します。なぜなら、エレメントと文字に 1 対 1 の対応があるからです。それ以外の場合、MecsElementToCharIndex は文字の位置を返します。1 は最初の文字、2 は 2 番目の文字を示します。
 
  たとえば、文字列が 2 つの文字で構成され、1 エレメント文字の次に 2 エレメント文字 (マルチバイト文字 / サロゲートペア) が続いている場合、MecsElementToCharIndex は Index が 1 のときに 1 を返し、Index が 2 か 3 のときに 2 を返し、Index がそれ以外の場合に 0 を返します。
 
  端的に言えば、MecsElementToCharIndex はエレメントインデックスから、そのエレメントを含む文字のインデックスを返す関数です。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の ByteToCharIndex / ElementToCharIndex (Delphi 2009 / 2010) に相当する機能です。

サンプルコード:

AnsiString(CP932)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字インデックス 1 2 3 4 5 6 7
文字 A B C D
バイナリ 0x41 0x42 0x82 0xA0 0x82 0xA2 0x82 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  Idx := ElementToCharIndex(A, 3);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := ElementToCharIndex(A, 6);     // 4
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharIndex(A, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharIndex(A, 6); // 4
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  A: AnsiString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  Idx := ByteToCharIndex(A, 3);             // 3
  ShowMessage(IntToStr(Idx));
  Idx := ByteToCharIndex(A, 6);             // 4
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharIndex(A, 3932); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharIndex(A, 6932); // 4
  ShowMessage(IntToStr(Idx));
end;

UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x0043 0x0044

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋CD';

  Idx := ElementToCharIndex(U, 4);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := ElementToCharIndex(U, 5);     // 4
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharIndex(U, 4); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharIndex(U, 5); // 4
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7  + '野屋CD';

  {$IFDEF UNICODE}
  Idx := ElementToCharIndex(W, 4);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := ElementToCharIndex(W, 5);     // 5
  ShowMessage(IntToStr(Idx));
  {$ELSE}
  // Delphi 2007 の ByteToCharIndex() に WideString 版はない
  // Delphi 2007 に ElementToCharIndex() はない
  {$ENDIF}

  Idx := MecsElementToCharIndex(W, 4); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharIndex(W, 5); // 5
  ShowMessage(IntToStr(Idx));
end;

UTF8String(CP_UTF8/CP65001)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10 11 12 13 14
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x41 0x42 0xF0 0xA0 0xAE 0xB7 0xE9 0x87 0x8E 0xE5 0xB1 0x8B 0x43 0x44

// Delphi 2009 / 2010 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$20BB7 + '野屋CD';

  Idx := ElementToCharIndex(U8, 5);     // 5 (NG)
  ShowMessage(IntToStr(Idx));
  Idx := ElementToCharIndex(U8, 8);     // 6 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharIndex(U8, 5); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharIndex(U8, 8); // 4
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';

  Idx := ByteToCharIndex(U8, 5);                 // 4 (NG)
  ShowMessage(IntToStr(Idx));
  Idx := ByteToCharIndex(U8, 8);                 // 6 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharIndex(U8, 5, CP_UTF8); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharIndex(U8, 8, CP_UTF8); // 4
  ShowMessage(IntToStr(Idx));
end;


MecsElementToCharLen 関数

MecsElementToCharLen 関数は文字列の最初の MaxLen エレメントに含まれている文字数を返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsElementToCharLen(const S: RawByteString; MaxLen: Integer): Integer;
  function MecsElementToCharLen(const S: RawByteString; MaxLen: Integer; CodePage: DWORD): Integer;
  function MecsElementToCharLen(const S: UnicodeString; MaxLen: Integer): Integer;
  function MecsElementToCharLen(const S: WideString; MaxLen: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsElementToCharLen(const S: AnsiString; MaxLen: Integer): Integer;
  function MecsElementToCharLen(const S: AnsiString; MaxLen: Integer; CodePage: DWORD): Integer;
  function MecsElementToCharLen(const S: WideString; MaxLen: Integer): Integer;
 
説明:
  MecsElementToCharLen 関数を呼び出すと、文字列の部分的な文字数がわかります。MecsElementToCharLen は MaxLen エレメントまたは文字列の最後のどちらか先に達する方までの文字数をカウントします。
 
  AnsiString 版において、マルチバイト文字セット (MBCS) の場合、MecsElementToCharLen の戻り値が MaxLen または文字列の長さより小さくなる場合があります。
 
  UnicodeString / WideString 版において、サロゲートペアが利用される環境の場合、MecsElementToCharLen の戻り値が MaxLen または文字列の長さより小さくなる場合があります。
 
  端的に言えば、MecsElementToCharLen はエレメントインデックスから文字列長を返す関数です。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の ByteToCharLen / ElementToCharLen (Delphi 2009 / 2010) に相当する機能です。

サンプルコード:

AnsiString(CP932)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字インデックス 1 2 3 4 5 6 7
文字 A B C D
バイナリ 0x41 0x42 0x82 0xA0 0x82 0xA2 0x82 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  Idx := ElementToCharLen(A, 3);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := ElementToCharLen(A, 6);     // 4
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharLen(A, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharLen(A, 6); // 4
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  A: AnsiString;
  Idx: Integer;
begin
  A := 'ABあいうCD';

  Idx := ByteToCharLen(A, 3);             // 3
  ShowMessage(IntToStr(Idx));
  Idx := ByteToCharLen(A, 6);             // 4
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharLen(A, 3932); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharLen(A, 6932); // 4
  ShowMessage(IntToStr(Idx));
end;

UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x0043 0x0044

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋CD';

  Idx := ElementToCharLen(U, 4);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := ElementToCharLen(U, 5);     // 4
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharLen(U, 4); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharLen(U, 5); // 4
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 / 2009 / 2010 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7  + '野屋CD';

  {$IFDEF UNICODE}
  Idx := ElementToCharLen(W, 4);     // 3
  ShowMessage(IntToStr(Idx));
  Idx := ElementToCharLen(W, 5);     // 5
  ShowMessage(IntToStr(Idx));
  {$ELSE}
  // Delphi 2007 の ByteToCharLen() に WideString版はない
  // Delphi 2007 に ElementToCharLen() はない
  {$ENDIF}

  Idx := MecsElementToCharLen(W, 4); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharLen(W, 5); // 5
  ShowMessage(IntToStr(Idx));
end;

UTF8String(CP_UTF8/CP65001)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10 11 12 13 14
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x41 0x42 0xF0 0xA0 0xAE 0xB7 0xE9 0x87 0x8E 0xE5 0xB1 0x8B 0x43 0x44

// Delphi 2009 / 2010 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$20BB7 + '野屋CD';

  Idx := ElementToCharLen(U8, 5);     // 5 (NG)
  ShowMessage(IntToStr(Idx));
  Idx := ElementToCharLen(U8, 8);     // 6 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharLen(U8, 5); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharLen(U8, 8); // 4
  ShowMessage(IntToStr(Idx));
end;

// Delphi 2007 での例
var
  U8: UTF8String;
  Idx: Integer;
begin
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';

  Idx := ByteToCharLen(U8, 5);                 // 4 (NG)
  ShowMessage(IntToStr(Idx));
  Idx := ByteToCharLen(U8, 8);                 // 6 (NG)
  ShowMessage(IntToStr(Idx));

  Idx := MecsElementToCharLen(U8, 5, CP_UTF8); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCharLen(U8, 8, CP_UTF8); // 4
  ShowMessage(IntToStr(Idx));
end;


MecsElementType 関数

MecsElementType 関数は文字列が 1 エレメントで 1 文字のエレメント, 2 エレメントで 1 文字の場合の最初のエレメント, 2 番目以降のエレメントのいずれであるかを示します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsElementType(const S: RawByteString; Index: Integer): TElementType;
  function MecsElementType(const S: RawByteString; Index: Integer; CodePage: DWORD): TElementType;
  function MecsElementType(const S: UnicodeString; Index: Integer): TElementType;
  function MecsElementType(const S: WideString; Index: Integer): TElementType;
 
Delphi 2007 の構文:
  function MecsElementType(const S: AnsiString; Index: Integer): TElementType;
  function MecsElementType(const S: AnsiString; Index: Integer; CodePage: DWORD): TElementType;
  function MecsElementType(const S: WideString; Index: Integer): TElementType;
 
説明:
  MecsElementType 関数を呼び出すと、文字列内の指定されたエレメントが、シングルエレメント文字か、マルチエレメント文字の最初のエレメントか、またはそれに続くエレメントのうちの 1 つであるのかを知ることができます。
 
  Index は、エレメントの種類を確認するエレメントを特定します。エレメントの番号は 1 から始まります。
 
  AnsiString 版において、マルチバイト文字セット (MBCS) を使わない環境では、ElementType は必ず etSingle を返します。それ以外の場合、ElementType は、指定されたエレメント (バイト) が完全な 1 文字を表すときに etSingle、2 バイト文字の最初のバイトを表すときに etLead、マルチバイト文字の 2 番目のバイトを表すときに etTrail を返します。
 
  UnicodeString / WideString 版において、サロゲートペアを使わない環境では、ElementType は必ず etSingle を返します。それ以外の場合、ElementType は、指定されたエレメント (ワード) が完全な 1 文字を表すときに etSingle、サロゲートペアの最初のワードを表すときに etLead、サロゲートペアの 2 番目のワードを表すときに etTrail を返します。
 
TElementType 説明
etSingle 1 つのエレメントで構成される文字。
etLead 2 つ以上のエレメントで構成される文字の最初のエレメント。
etTrail 2 つ以上のエレメントで構成される文字の2 つ目以降のエレメント。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の ByteType に相当する機能です。
 
メモ:
  Index が S の長さの範囲内にあるかどうかのチェックは一切行われません。Index が範囲外にならないようにするのは呼び出し側の責任です。

MecsInsert 手続き

MecsInsert 手続きは部分文字列を文字列の指定された位置に挿入します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  procedure MecsInsert(const Source: RawByteString; var S: RawByteString; Index: Integer);
  procedure MecsInsert(const Source: RawByteString; var S: RawByteString; Index: Integer; CodePage: DWORD);
  procedure MecsInsert(const Source: UnicodeString; var S: UnicodeString; Index: Integer);
  procedure MecsInsert(const Source: WideString; var S: WideString; Index: Integer);
 
Delphi 2007 の構文:
  procedure MecsInsert(const Source: AnsiString; var S: AnsiString; Index: Integer);
  procedure MecsInsert(const Source: AnsiString; var S: AnsiString; Index: Integer; CodePage: DWORD);
  procedure MecsInsert(const Source: WideString; var S: WideString; Index: Integer);
 
説明:
  MecsInsert 手続きは Source を S に index 文字目の位置から挿入します。
 
  Source は文字列型の式です。S は任意の長さの文字列型の変数です。Index は整数型の式です。Index は文字インデックスです。
 
  Index が 1 未満の場合、Index は 1 にマップされます。Index が文字列の最後を過ぎている場合、Index は文字列の長さに設定され、操作が追加に変わります。
 
  Source パラメータが空の文字列の場合、Insert は何もしません
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の Insert に相当する機能です。

MecsIsFullWidth 関数

MecsIsFullWidth 関数は文字が FULL_WIDTH であるかを判定します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsIsFullWidth(const S: RawByteString; CharIndex: Integer): Boolean;
  function MecsIsFullWidth(const S: RawByteString; CharIndex: Integer; FarEast: Boolean): Boolean;
  function MecsIsFullWidth(const S: RawByteString; CharIndex: Integer; FarEast: Boolean; CodePage: DWORD): Boolean;
  function MecsIsFullWidth(const S: UnicodeString; CharIndex: Integer): Boolean;
  function MecsIsFullWidth(const S: UnicodeString; CharIndex: Integer; FarEast: Boolean): Boolean;
  function MecsIsFullWidth(const S: WideString; CharIndex: Integer): Boolean;
  function MecsIsFullWidth(const S: WideString; CharIndex: Integer; FarEast: Boolean): Boolean;
 
Delphi 2007 の構文:
  function MecsIsFullWidth(const S: AnsiString; CharIndex: Integer): Boolean;
  function MecsIsFullWidth(const S: AnsiString; CharIndex: Integer; FarEast: Boolean): Boolean;
  function MecsIsFullWidth(const S: AnsiString; CharIndex: Integer; FarEast: Boolean; CodePage: DWORD): Boolean;
  function MecsIsFullWidth(const S: WideString; CharIndex: Integer): Boolean;
  function MecsIsFullWidth(const S: WideString; CharIndex: Integer; FarEast: Boolean): Boolean;
 
説明:
  MecsIsFullWidth 関数は文字列 S の CharIndex 文字目が、いわゆる全角文字であるかを判定します。
 
  FarEast に True を設定すると、東アジアの文字幅が適用されます。 FarEast を指定しなかった場合には、FarEast の条件として SysLocale.FarEast が使われます。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
サンプルコード:

  以下はよくある"文字列を右詰めする"サンプルコードです。フォームに Memo1、Memo2 と Button1 を貼り付けて実行してみましょう。

// Delphi 2009 / 2010 での例
procedure TForm1.Button1Click(Sender: TObject);
var
  U: UnicodeString;
begin
  U := 'Aαあ' + #$20BB7;

  Memo1.Lines.Clear;
  Memo1.Font.Name    := 'MS ゴシック';
  Memo1.Font.Size    := 10;
  Memo1.Font.CharSet := SHIFTJIS_CHARSET;

  Memo2.Lines.Clear;
  Memo2.Font.Name    := 'Courier New';
  Memo2.Font.Size    := 10;
  Memo2.Font.CharSet := ANSI_CHARSET;

  Memo1.Lines.Add(StringOfChar('*'10));
  Memo1.Lines.Add(StringOfChar(' '10 - Length(U)) + U);

  Memo2.Lines.Add(StringOfChar('*'10));
  Memo2.Lines.Add(StringOfChar(' '10 - Length(U)) + U);
end;

  さて、結果はいかがでしたか?プロポーショナルフォントでもないのに揃いませんね。実はこのコードには 3 つの問題点があります。
  1. 'A' も 'あ' も Length() ではサイズが 1 になる
    Unicode (UTF-16) では 'A' も 'あ' もエレメントサイズは 1 です。

  2. 'α' は東アジアでは全角サイズ、それ以外の地域では半角サイズで描画される。
    Unicode (UTF-16) に於いて 'α' のエレメントサイズは 1 ですが、国や地域、フォントによって描画されるサイズが異なる文字があります。ギリシャ文字はその一部です。

  3. #$20BB7 はサロゲートペア。
    U+20BB7 のエレメントサイズは 2 (#$D842 #$DFB7) で、全角サイズで描画されています。
  Unicode で正しく右詰めするには以下のようなコードを記述する必要があります。

// Delphi 2009 / 2010 での例
procedure TForm1.Button1Click(Sender: TObject);
var
  U: UnicodeString;
  i: Integer;
  Cnt: Integer;
begin
  U := 'Aαあ' + #$20BB7;

  Memo1.Lines.Clear;
  Memo1.Font.Name    := 'MS ゴシック';
  Memo1.Font.Size    := 10;
  Memo1.Font.CharSet := SHIFTJIS_CHARSET;

  Memo2.Lines.Clear;
  Memo2.Font.Name    := 'Courier New';
  Memo2.Font.Size    := 10;
  Memo2.Font.CharSet := ANSI_CHARSET;

  Memo1.Lines.Add(StringOfChar('*'10));
  Cnt := 0;
  for i:=1 to MecsLength(U) do
    if MecsIsFullWidth(U, i, IsFarEastCharSet(Memo1.Font.CharSet)) then
      Inc(Cnt, 2)
    else
      Inc(Cnt, 1);
  Memo1.Lines.Add(StringOfChar(' '10 - Cnt) + U);

  Memo2.Lines.Add(StringOfChar('*'10));
  Cnt := 0;
  for i:=1 to MecsLength(U) do
    if MecsIsFullWidth(U, i, IsFarEastCharSet(Memo2.Font.CharSet)) then
      Inc(Cnt, 2)
    else
      Inc(Cnt, 1);
  Memo2.Lines.Add(StringOfChar(' '10 - Cnt) + U);
end;

  サンプルでは東アジアの判定に IsFarEastCharSet を使いましたが、 IsFarEastLCID を使う事もできます。状況に応じてフォントやLCID等、東アジアを判定する方法を変更する必要があります。

関連情報:

MecsIsLeadElement 関数

MecsIsLeadElement 関数は文字列のエレメントが文字を構成する最初のエレメントであるかを示します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsIsLeadElement(TestChar: AnsiChar): Boolean;
  function MecsIsLeadElement(TestChar: AnsiChar; CodePage: DWORD): Boolean;
  function MecsIsLeadElement(TestChar: UnicodeChar): Boolean;
 
Delphi 2007 の構文:
  function MecsIsLeadElement(TestChar: AnsiChar): Boolean;
  function MecsIsLeadElement(TestChar: AnsiChar; CodePage: DWORD): Boolean;
  function MecsIsLeadElement(TestChar: WideChar): Boolean;
 
説明:
  MecsIsLeadElement 関数は文字列のエレメントが文字を構成する最初のエレメントであるかを示します。
 
  AnsiString 版においては、マルチバイト文字セット (MBCS) の最初のバイト (Lead Byte) であるかを判定します。
 
  UnicodeString / WideString 版においては、サロゲートペアの最初のワード (High Surrogate) であるかを判定します。
 
  AnsiChar 版を使う際には CodePage を設定し、コードページを強制すべきです。何故なら、Delphi 2009 / 2010 であっても AnsiChar のコードページを自動的に知る事はできないからです。

MecsIsMECElement 関数

MecsIsMECElement 関数は文字列のエレメントが複数のエレメントで文字を構成するエレメントであるかを示します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsIsMECElement(TestChar: AnsiChar): Boolean;
  function MecsIsMECElement(TestChar: AnsiChar; CodePage: DWORD): Boolean;
  function MecsIsMECElement(TestChar: UnicodeChar): Boolean;
 
Delphi 2007 の構文:
  function MecsIsMECElement(TestChar: AnsiChar): Boolean;
  function MecsIsMECElement(TestChar: AnsiChar; CodePage: DWORD): Boolean;
  function MecsIsMECElement(TestChar: WideChar): Boolean;
 
説明:
  MecsIsMECElement 関数は文字列のエレメントが複数のエレメントで文字を構成するエレメントであるかを示します。
 
  AnsiString 版においては、マルチバイト文字セット (MBCS) を構成するエレメントであるかを判定します。
 
  UnicodeString / WideString 版においては、サロゲートペアを構成するエレメントであるかを判定します。
 
  AnsiChar 版を使う際には CodePage を設定し、コードページを強制すべきです。何故なら、Delphi 2009 / 2010 であっても AnsiChar のコードページを自動的に知る事はできないからです。

MecsIsTrailElement 関数

MecsIsTrailElement 関数は文字列のエレメントが文字を構成する 2 番目以降のエレメントであるかを示します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsIsTrailElement(TestChar: AnsiChar): Boolean;
  function MecsIsTrailElement(TestChar: AnsiChar; CodePage: DWORD): Boolean;
  function MecsIsTrailElement(TestChar: UnicodeChar): Boolean;
 
Delphi 2007 の構文:
  function MecsIsTrailElement(TestChar: AnsiChar): Boolean;
  function MecsIsTrailElement(TestChar: AnsiChar; CodePage: DWORD): Boolean;
  function MecsIsTrailElement(TestChar: WideChar): Boolean;
 
説明:
  MecsIsTrailElement 関数は文字列のエレメントが文字を構成する 2 番目以降のエレメントであるかを示します。
 
  AnsiString 版においては、マルチバイト文字セット (MBCS) の2 番目以降のバイト (Trail Byte) であるかを判定します。
 
  UnicodeString / WideString 版においては、サロゲートペアの2 番目のワード (Low Surrogate) であるかを判定します。
 
  AnsiChar 版を使う際には CodePage を設定し、コードページを強制すべきです。何故なら、Delphi 2009 / 2010 であっても AnsiChar のコードページを自動的に知る事はできないからです。 また、マルチバイト Ansi においては Lead-Byte と Trail-Byte の範囲が重複している事が多いので、MecsIsTrailElement 単体での使用は避けるべきです。

MecsLeftStr 関数

MecsLeftStr 関数は文字列の最初に表示される指定された長さの部分文字列を返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsLeftStr(const AText: RawByteString; const ACount: Integer): RawByteString;
  function MecsLeftStr(const AText: RawByteString; const ACount: Integer; CodePage: DWORD): RawByteString;
  function MecsLeftStr(const AText: UnicodeString; const ACount: Integer): UnicodeString;
  function MecsLeftStr(const AText: WideString; const ACount: Integer): WideString;
 
Delphi 2007 の構文:
  function MecsLeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  function MecsLeftStr(const AText: AnsiString; const ACount: Integer; CodePage: DWORD): AnsiString;
  function MecsLeftStr(const AText: WideString; const ACount: Integer): WideString;
 
説明:
  MecsLeftStr 関数は、AText の先頭から ACount で指定された文字数以内の文字数を返します。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の LeftStr/AnsiLeftStr に相当する機能です。AnsiString 版 は AnsiLeftStr と違い、ラウンドトリップの問題を引き起こしません (※Delphi 2009 Update 3 以降ではラウンドトリップしません)。UnicodeString / WideString 版はサロゲートペアを考慮します。
 
サンプルコード:

AnsiString(CP932)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字 A B C D
バイナリ 0x41 0x42 0x82 0xA0 0x82 0xA2 0x82 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
begin
  // LeftStr
  A := 'ABあいうCD';
  A := StrUtils.LeftStr(A, 3);
  ShowMessage(A);                       // AB?

  // LeftBStr                            
  A := 'ABあいうCD';
  A := StrUtils.LeftBStr(A, 3);
  ShowMessage(A);                       // AB?

  // AnsiLeftStr                         
  A := 'ABあいうCD';
  A := AnsiStrings.AnsiLeftStr(A, 3);
  ShowMessage(A);                       // ABあ

  // MecsLeftStr                         
  A := 'ABあいうCD';
  A := MecsLeftStr(A, 3);
  ShowMessage(A);                       // ABあ
end

// Delphi 2007 での例
var
  A: AnsiString;
begin
  // LeftStr
  A := 'ABあいうCD';
  A := LeftStr(A, 3);
  ShowMessage(A);                // AB?

  // LeftBStr
  A := 'ABあいうCD';
  A := LeftBStr(A, 3);
  ShowMessage(A);                // AB?

  // AnsiLeftStr
  A := 'ABあいうCD';
  A := AnsiLeftStr(A, 3);
  ShowMessage(A);                // ABあ

  // MecsLeftStr
  A := 'ABあいうCD';
  A := MecsLeftStr(A, 3932);
  ShowMessage(A);                // ABあ
end;

  ヘルプを読む限りでは AnsiLeftStr と LeftStr には差異がないはずなのですが、結果からすると LeftStr と LeftBStr が同等のようです。AnsiLeftStr は正常に動作しているように見えます。しかし、次のコードではどうでしょうか?

AnsiString(CP932)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字インデックス 1 2 3 4 5 6 7
文字 A B C D
バイナリ 0x41 0x42 0x81 0xE6 0x87 0xFA 0x5B 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
  procedure ShowBinary(S: RawByteString);
  var
    i: Integer;
    Dmy: RawByteString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + AnsiStrings.Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // AnsiLeftStr
  A :=     'A';
  A := A + 'B';
  A := A + #$81#$E6;
  A := A + #$87#$9A;
  A := A + #$FA#$5B;
  A := A + 'C';
  A := A + 'D';
  A := StrUtils.AnsiLeftStr(A, 5);
  ShowBinary(A);                     // #$41 #$42 #$81#$E6 #$81#$E6 #$81#$E6 (NG)

  // MecsLeftStr
  A :=     'A';
  A := A + 'B';
  A := A + #$81#$E6;
  A := A + #$87#$9A;
  A := A + #$FA#$5B;
  A := A + 'C';
  A := A + 'D';
  A := MecsLeftStr(A, 5);
  ShowBinary(A);                     // #$41 #$42 #$81#$E6 #$87#$9A #$FA#$5B
end;

// Delphi 2007 での例
var
  A: AnsiString;
  procedure ShowBinary(S: AnsiString);
  var
    i: Integer;
    Dmy: AnsiString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // AnsiLeftStr
  A := 'AB' + #$81#$E6 + #$87#$9A + #$FA#$5B + 'CD';
  A := AnsiLeftStr(A, 5);
  ShowBinary(A);                     // #$41 #$42 #$81#$E6 #$81#$E6 #$81#$E6 (NG)

  // MecsLeftStr
  A := 'AB' + #$81#$E6 + #$87#$9A + #$FA#$5B + 'CD';
  A := MecsLeftStr(A, 5932);
  ShowBinary(A);                     // #$41 #$42 #$81#$E6 #$87#$9A #$FA#$5B #$43 #$44
end;

  AnsiLeftStr の AnsiString 版は内部で WideString/UnicodeString へ変換してから文字列操作を行い、結果を AnsiString で返します。そのため、ラウンドトリップ変換を行う事になり、CP932 の"字形が同じで別のコードポイントの文字"は Unicode の一つのコードポイントにまとめられてしまいます。

UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x0043 0x0044

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  // LeftStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := LeftStr(U, 5);            // AB𠮷野 (サロゲートペアが考慮されない)
  ShowMessage(U);


  // AnsiLeftStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := AnsiLeftStr(U, 5);        // AB𠮷野 (サロゲートペアが考慮されない)
  ShowMessage(U);

  // MecsLeftStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := MecsLeftStr(U, 5);        // AB𠮷野屋
  ShowMessage(U);
end;

// Delphi 2007 での例
// (通常、ShowMessage ではサロゲートペアを表示できない)
var
  W: WideString;
  Idx: Integer;
begin
  // LeftStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := LeftStr(W, 5);             // AB𠮷野 (サロゲートペアが考慮されない)
  ShowMessage(W);


  // AnsiLeftStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := AnsiLeftStr(W, 5);        // AB𠮷野 (サロゲートペアが考慮されない)
  ShowMessage(W);

  // MecsLeftStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := MecsLeftStr(W, 5);        // AB𠮷野屋
  ShowMessage(W);
end;

UTF8String(CP_UTF8/CP65001)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10 11 12 13 14
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x41 0x42 0xF0 0xA0 0xAE 0xB7 0xE9 0x87 0x8E 0xE5 0xB1 0x8B 0x43 0x44

// Delphi 2009 / 2010 での例
var
  U8: UTF8String;
  Idx: Integer;
  procedure ShowBinary(S: RawByteString);
  var
    i: Integer;
    Dmy: RawByteString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + AnsiStrings.Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // LeftStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := StrUtils.LeftStr(U8, 5);        // #$41#$42#$3F#$3F#$E3#$83#$BB (NG)     
  ShowBinary(U8);

  // AnsiLeftStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := AnsiStrings.AnsiLeftStr(U8, 5); // #$41#$42#$3F#$3F#$E9#$87#$8E (NG)   
  ShowBinary(U8);

  // MecsLeftStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := MecsLeftStr(U8, 5);             // #$41 #$42 #$F0#$A0#$AE#$B7 #$E9#$87#$8E #$E5#$B1#$8B
  ShowBinary(U8);
end;

// Delphi 2007 での例
// (通常、ShowMessage ではサロゲートペアを表示できない)
var
  U8: UTF8String;
  Idx: Integer;
  procedure ShowBinary(S: AnsiString);
  var
    i: Integer;
    Dmy: AnsiString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // LeftStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := LeftStr(U8, 5);              // #$41#$42#$F0#$A0#$AE (NG)
  ShowBinary(U8);

  // AnsiLeftStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := AnsiLeftStr(U8, 5);          // #$41#$42#$F0#$A0#$AE#$B7 (NG)
  ShowBinary(U8);

  // MecsLeftStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := MecsLeftStr(U8, 5, CP_UTF8); // #$41 #$42 #$F0#$A0#$AE#$B7 #$E9#$87#$8E #$E5#$B1#$8B
  ShowBinary(U8);
end;

関連情報:

MecsLength 関数

MecsLength 関数は文字列内の文字数を返します
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsLength(const S: RawByteString): Integer;
  function MecsLength(const S: RawByteString; CodePage: DWORD): Integer;
  function MecsLength(const S: UnicodeString): Integer;
  function MecsLength(const S: WideString): Integer;
 
Delphi 2007 の構文:
  function MecsLength(const S: AnsiString): Integer;
  function MecsLength(const S: AnsiString; CodePage: DWORD): Integer;
  function MecsLength(const S: WideString): Integer;
 
説明:
  MecsLength 関数は文字列内の文字数を返します。マルチバイト文字 / サロゲートペア が考慮されます。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の Length の文字数版ですが、動的配列はサポートされません。

MecsMidStr 関数

MecsMidStr 関数は文字列内の指定された部分に表示される、指定された長さの部分文字列を返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsMidStr(const AText: RawByteString; const AStart, ACount: Integer): RawByteString;
  function MecsMidStr(const AText: RawByteString; const AStart, ACount: Integer; CodePage: DWORD): RawByteString;
  function MecsMidStr(const AText: UnicodeString; const AStart, ACount: Integer): UnicodeString;
  function MecsMidStr(const AText: WideString; const AStart, ACount: Integer): WideString;
 
Delphi 2007 の構文:
  function MecsMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
  function MecsMidStr(const AText: AnsiString; const AStart, ACount: Integer; CodePage: DWORD): AnsiString;
  function MecsMidStr(const AText: WideString; const AStart, ACount: Integer): WideString;
 
説明:
  MecsMidStr は、AText の AStart 文字目から Count プロパティで指定した文字数の部分文字列を返します。
 
  もし AStart が AText 文字列の長さよりも大きい場合、MidStr 関数は空文字列を返します。
 
  Count が有効な文字数以上の値を指定している場合は、AText の AStart 文字目から AText の最後までの文字のみが返されます。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の MidStr/AnsiMidStr に相当する機能です。AnsiString 版 は AnsiMidStr と違い、ラウンドトリップの問題を引き起こしません (※Delphi 2009 Update 3 以降ではラウンドトリップしません)。UnicodeString / WideString 版はサロゲートペアを考慮します。
 
サンプルコード:

AnsiString(CP932)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字 A B C D
バイナリ 0x41 0x42 0x82 0xA0 0x82 0xA2 0x82 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
begin
  // MidStr
  A := 'ABあいうCD';
  A := StrUtils.MidStr(A, 23);
  ShowMessage(A);                       // Bあ

  // MidBStr                            
  A := 'ABあいうCD';                    
  A := StrUtils.MidBStr(A, 23);       
  ShowMessage(A);                       // Bあ

  // AnsiMidStr                         
  A := 'ABあいうCD';                    
  A := AnsiStrings.AnsiMidStr(A, 23); 
  ShowMessage(A);                       // Bあい

  // MecsMidStr                         
  A := 'ABあいうCD';                    
  A := MecsMidStr(A, 23);             
  ShowMessage(A);                       // Bあい
end

// Delphi 2007 での例
var
  A: AnsiString;
begin
  // MidStr
  A := 'ABあいうCD';
  A := MidStr(A, 23);
  ShowMessage(A);                // Bあ

  // MidBStr
  A := 'ABあいうCD';
  A := MidBStr(A, 23);
  ShowMessage(A);                // Bあ

  // AnsiMidStr
  A := 'ABあいうCD';
  A := AnsiMidStr(A, 23);
  ShowMessage(A);                // Bあい

  // MecsMidStr
  A := 'ABあいうCD';
  A := MecsMidStr(A, 23932);
  ShowMessage(A);                // Bあい
end;

  ヘルプを読む限りでは AnsiMidStr と MidStr には差異がないはずなのですが、結果からすると MidStr と MidBStr が同等のようです。AnsiMidStr は正常に動作しているように見えます。しかし、次のコードではどうでしょうか?

AnsiString(CP932)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字インデックス 1 2 3 4 5 6 7
文字 A B C D
バイナリ 0x41 0x42 0x81 0xE6 0x87 0xFA 0x5B 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
  procedure ShowBinary(S: RawByteString);
  var
    i: Integer;
    Dmy: RawByteString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + AnsiStrings.Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // AnsiMidStr
  A :=     'A';
  A := A + 'B';
  A := A + #$81#$E6;
  A := A + #$87#$9A;
  A := A + #$FA#$5B;
  A := A + 'C';
  A := A + 'D';
  A := StrUtils.AnsiMidStr(A, 33);
  ShowBinary(A);                     // #$81#$E6 #$81#$E6 #$81#$E6 (NG)

  // MecsMidStr
  A :=     'A';
  A := A + 'B';
  A := A + #$81#$E6;
  A := A + #$87#$9A;
  A := A + #$FA#$5B;
  A := A + 'C';
  A := A + 'D';
  A := MecsMidStr(A, 33);
  ShowBinary(A);                     // #$81#$E6 #$87#$9A #$FA#$5B
end;

// Delphi 2007 での例
var
  A: AnsiString;
  procedure ShowBinary(S: AnsiString);
  var
    i: Integer;
    Dmy: AnsiString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // AnsiMidStr
  A := 'AB' + #$81#$E6 + #$87#$9A + #$FA#$5B + 'CD';
  A := AnsiMidStr(A, 33);
  ShowBinary(A);                     // #$81#$E6 #$81#$E6 #$81#$E6 (NG)

  // MecsMidStr
  A := 'AB' + #$81#$E6 + #$87#$9A + #$FA#$5B + 'CD';
  A := MecsMidStr(A, 33);
  ShowBinary(A);                     // #$81#$E6 #$87#$9A #$FA#$5B
end;

  AnsiMidStr の AnsiString 版は内部で WideString/UnicodeString へ変換してから文字列操作を行い、結果を AnsiString で返します。そのため、ラウンドトリップ変換を行う事になり、CP932 の"字形が同じで別のコードポイントの文字"は Unicode の一つのコードポイントにまとめられてしまいます。

UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x0043 0x0044

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  // MidStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := MidStr(U, 33);
  ShowMessage(U);                  // 𠮷野 (サロゲートペアが考慮されない)


  // AnsiMidStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := AnsiMidStr(U, 33);        // 𠮷野 (サロゲートペアが考慮されない)
  ShowMessage(U);

  // MecsMidStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := MecsMidStr(U, 33);
  ShowMessage(U);                  // 𠮷野屋
end;

// Delphi 2007 での例
// (通常、ShowMessage ではサロゲートペアを表示できない)
var
  W: WideString;
  Idx: Integer;
begin
  // MidStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := MidStr(W, 33);
  ShowMessage(W);                  // 𠮷野 (サロゲートペアが考慮されない)


  // AnsiMidStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := AnsiMidStr(W, 33);        // 𠮷野 (サロゲートペアが考慮されない)
  ShowMessage(W);

  // MecsMidStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := MecsMidStr(W, 33);
  ShowMessage(W);                  // 𠮷野屋
end;

UTF8String(CP_UTF8/CP65001)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10 11 12 13 14
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x41 0x42 0xF0 0xA0 0xAE 0xB7 0xE9 0x87 0x8E 0xE5 0xB1 0x8B 0x43 0x44

// Delphi 2009 / 2010 での例
var
  U8: UTF8String;
  Idx: Integer;
  procedure ShowBinary(S: RawByteString);
  var
    i: Integer;
    Dmy: RawByteString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + AnsiStrings.Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // MidStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := StrUtils.MidStr(U8, 33);        // #$3F#$3F#$E3#$83#$BB (NG)
  ShowBinary(U8);

  // AnsiMidStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := AnsiStrings.AnsiMidStr(U8, 33); // #$3F#$3F#$E9#$87#$8E (NG)
  ShowBinary(U8);

  // MecsMidStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := MecsMidStr(U8, 33);             // #$F0#$A0#$AE#$B7 #$E9#$87#$8E #$E5#$B1#$8B
  ShowBinary(U8);
end;

// Delphi 2007 での例
// (通常、ShowMessage ではサロゲートペアを表示できない)
var
  U8: UTF8String;
  Idx: Integer;
  procedure ShowBinary(S: AnsiString);
  var
    i: Integer;
    Dmy: AnsiString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // MidStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := MidStr(U8, 33);              // #$F0#$A0#$AE (NG)
  ShowBinary(U8);

  // AnsiMidStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := AnsiMidStr(U8, 33);          // #$F0#$A0#$AE#$B7 (NG)
  ShowBinary(U8);

  // MecsMidStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := MecsMidStr(U8, 33, CP_UTF8); // #$F0#$A0#$AE#$B7 #$E9#$87#$8E #$E5#$B1#$8B
  ShowBinary(U8);
end;

関連情報:

MecsNextCharIndex 関数

MecsNextCharIndex 関数は次の文字のエレメントインデックスを返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsNextCharIndex(const S: RawByteString; Index: Integer): Integer;
  function MecsNextCharIndex(const S: RawByteString; Index: Integer; CodePage: DWORD): Integer;
  function MecsNextCharIndex(const S: UnicodeString; Index: Integer): Integer;
  function MecsNextCharIndex(const S: WideString; Index: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsNextCharIndex(const S: AnsiString; Index: Integer): Integer;
  function MecsNextCharIndex(const S: AnsiString; Index: Integer; CodePage: DWORD): Integer;
  function MecsNextCharIndex(const S: WideString; Index: Integer): Integer;
 
説明:
  MecsNextCharIndex は、Index 文字目から始まる文字に続く文字の最初のエレメントのエレメントインデックスを返します。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の NextCharIndex に相当する機能です。

  Delphi 2009 / 2010 では NextCharIndex (AnsiString 版) が AnsiStrings 名前空間と SysUtils 名前空間に重複して存在します (オーバーロードされたものではありません)。 そのため、AnsiStrings を uses していると"E2251 'CharLength' へのオーバーロード呼び出しはあいまいです"が発生してしまいます。このような場合には、"AnsiStrings.NextCharIndex"のように名前空間を明示する必要があります。

MecsReverseString 関数

MecsReverseString 関数は指定した文字列の向きを逆にしたものを返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsReverseString(const AText: RawByteString): RawByteString;
  function MecsReverseString(const AText: RawByteString; CodePage: DWORD): RawByteString;
  function MecsReverseString(const AText: UnicodeString): UnicodeString;
  function MecsReverseString(const AText: WideString): WideString;
 
Delphi 2007 の構文:
  function MecsReverseString(const AText: AnsiString): AnsiString;
  function MecsReverseString(const AText: AnsiString; CodePage: DWORD): AnsiString;
  function MecsReverseString(const AText: WideString): WideString;
 
説明:
  MecsReverseString 関数は、AText で指定した値の文字を逆向きに配置したものを返します。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の ReverseString/AnsiReverseString に相当する機能です。AnsiString 版は AnsiReverseString と違い、ラウンドトリップの問題を引き起こしません (※Delphi 2009 Update 3 以降ではラウンドトリップしません)。UnicodeString / WideString 版はサロゲートペアを考慮します。
 
関連情報:

MecsRightStr 関数

MecsRightStr 関数は文字列の最後に表示される指定された長さの部分文字列を返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsRightStr(const AText: RawByteString; const ACount: Integer): RawByteString;
  function MecsRightStr(const AText: RawByteString; const ACount: Integer; CodePage: DWORD): RawByteString;
  function MecsRightStr(const AText: UnicodeString; const ACount: Integer): UnicodeString;
  function MecsRightStr(const AText: WideString; const ACount: Integer): WideString;
 
Delphi 2007 の構文:
  function MecsRightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  function MecsRightStr(const AText: AnsiString; const ACount: Integer; CodePage: DWORD): AnsiString;
  function MecsRightStr(const AText: WideString; const ACount: Integer): WideString;
 
説明:
  MecsRightStr 関数は、AText の末尾から ACount 以内の文字数を返します。したがって、たとえば、AText が 'Programmer' という文字列で、ACount が 7 であるとすると、MecsRightStr は 'grammer' という文字列を返します。
 
  AnsiString 版関数に CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の RightStr/AnsiRightStr に相当する機能です。AnsiString 版は AnsiRightStr と違い、ラウンドトリップの問題を引き起こしません (※Delphi 2009 Update 3 以降ではラウンドトリップしません)。UnicodeString / WideString 版はサロゲートペアを考慮します。
 
サンプルコード:

AnsiString(CP932)
文字インデックス 1 2 3 4 5 6 7
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字 A B C D
バイナリ 0x41 0x42 0x82 0xA0 0x82 0xA2 0x82 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
begin
  // RightStr
  A := 'ABあいうCD';
  A := StrUtils.RightStr(A, 3);
  ShowMessage(A);                       // ?CD

  // RightBStr                            
  A := 'ABあいうCD';                    
  A := StrUtils.RightBStr(A, 3);       
  ShowMessage(A);                       // ?CD

  // AnsiRightStr                         
  A := 'ABあいうCD';                    
  A := AnsiStrings.AnsiRightStr(A, 3); 
  ShowMessage(A);                       // うCD

  // MecsRightStr                         
  A := 'ABあいうCD';                    
  A := MecsRightStr(A, 3);             
  ShowMessage(A);                       // うCD
end

// Delphi 2007 での例
var
  A: AnsiString;
begin
  // RightStr
  A := 'ABあいうCD';
  A := RightStr(A, 3);
  ShowMessage(A);                // ?CD

  // RightBStr
  A := 'ABあいうCD';
  A := RightBStr(A, 3);
  ShowMessage(A);                // ?CD

  // AnsiRightStr
  A := 'ABあいうCD';
  A := AnsiRightStr(A, 3);
  ShowMessage(A);                // うCD

  // MecsRightStr
  A := 'ABあいうCD';
  A := MecsRightStr(A, 3932);
  ShowMessage(A);                // うCD
end;

  ヘルプを読む限りでは AnsiRightStr と RightStr には差異がないはずなのですが、結果からすると RightStr と RightBStr が同等のようです。AnsiRightStr は正常に動作しているように見えます。しかし、次のコードではどうでしょうか?

AnsiString(CP932)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
文字インデックス 1 2 3 4 5 6 7
文字 A B C D
バイナリ 0x41 0x42 0x81 0xE6 0x87 0xFA 0x5B 0xA4 0x43 0x44

// Delphi 2009 / 2010 での例
type
  SJISString = type AnsiString(932);
var
  A: SJISString;
  procedure ShowBinary(S: RawByteString);
  var
    i: Integer;
    Dmy: RawByteString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + AnsiStrings.Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // AnsiRightStr
  A :=     'A';
  A := A + 'B';
  A := A + #$81#$E6;
  A := A + #$87#$9A;
  A := A + #$FA#$5B;
  A := A + 'C';
  A := A + 'D';
  A := StrUtils.AnsiRightStr(A, 5);
  ShowBinary(A);                     // #$81#$E6 #$81#$E6 #$81#$E6 #$43 #$44 (NG)

  // MecsRightStr
  A :=     'A';
  A := A + 'B';
  A := A + #$81#$E6;
  A := A + #$87#$9A;
  A := A + #$FA#$5B;
  A := A + 'C';
  A := A + 'D';
  A := MecsRightStr(A, 5);
  ShowBinary(A);                     // #$81#$E6 #$87#$9A #$FA#$5B #$43 #$44
end;

// Delphi 2007 での例
var
  A: AnsiString;
  procedure ShowBinary(S: AnsiString);
  var
    i: Integer;
    Dmy: AnsiString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // AnsiRightStr
  A := 'AB' + #$81#$E6 + #$87#$9A + #$FA#$5B + 'CD';
  A := AnsiRightStr(A, 5);
  ShowBinary(A);                     // #$81#$E6 #$81#$E6 #$81#$E6 #$43 #$44 (NG)

  // MecsRightStr
  A := 'AB' + #$81#$E6 + #$87#$9A + #$FA#$5B + 'CD';
  A := MecsRightStr(A, 5932);
  ShowBinary(A);                     // #$81#$E6 #$87#$9A #$FA#$5B #$43 #$44
end;

  AnsiRightStr の AnsiString 版は内部で WideString/UnicodeString へ変換してから文字列操作を行い、結果を AnsiString で返します。そのため、ラウンドトリップ変換を行う事になり、CP932 の"字形が同じで別のコードポイントの文字"は Unicode の一つのコードポイントにまとめられてしまいます。

UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x0043 0x0044

// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  // RightStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := RightStr(U, 5);            // 野屋CD (サロゲートペアが考慮されない)
  ShowMessage(U);


  // AnsiRightStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := AnsiRightStr(U, 5);        // 野屋CD (サロゲートペアが考慮されない)
  ShowMessage(U);

  // MecsRightStr
  U := 'AB' + #$20BB7 + '野屋CD';
  U := MecsRightStr(U, 5);        // 𠮷野屋CD
  ShowMessage(U);
end;

// Delphi 2007 での例
// (通常、ShowMessage ではサロゲートペアを表示できない)
var
  W: WideString;
  Idx: Integer;
begin
  // RightStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := RightStr(W, 5);
  ShowMessage(W);                  // ?野屋CD (サロゲートペアが考慮されない)


  // AnsiRightStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := AnsiRightStr(W, 5);        // ?野屋CD (サロゲートペアが考慮されない)
  ShowMessage(W);

  // MecsRightStr
  W := 'AB' + #$D842#$DFB7 + '野屋CD';
  W := MecsRightStr(W, 5);        // 𠮷野屋
  ShowMessage(W);
end;

UTF8String(CP_UTF8/CP65001)
エレメントインデックス 1 2 3 4 5 6 7 8 9 10 11 12 13 14
文字インデックス 1 2 3 4 5 6 7
文字 A B 𠮷 C D
バイナリ 0x41 0x42 0xF0 0xA0 0xAE 0xB7 0xE9 0x87 0x8E 0xE5 0xB1 0x8B 0x43 0x44

// Delphi 2009 / 2010 での例
var
  U8: UTF8String;
  Idx: Integer;
  procedure ShowBinary(S: RawByteString);
  var
    i: Integer;
    Dmy: RawByteString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + AnsiStrings.Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // RightStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := StrUtils.RightStr(U8, 5);        // #$E3#$83#$BB#$EF#$BD#$AE#$43#$44 (NG)     
  ShowBinary(U8);

  // AnsiRightStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := AnsiStrings.AnsiRightStr(U8, 5); // #$3F#$E9#$87#$8E#$E5#$B1#$8B#$43#$44 (NG)   
  ShowBinary(U8);

  // MecsRightStr
  U8 := 'AB' + #$20BB7 + '野屋CD';
  U8 := MecsRightStr(U8, 5);             // #$F0#$A0#$AE#$B7 #$E9#$87#$8E #$E5#$B1#$8B #$43 #$44
  ShowBinary(U8);
end;

// Delphi 2007 での例
// (通常、ShowMessage ではサロゲートペアを表示できない)
var
  U8: UTF8String;
  Idx: Integer;
  procedure ShowBinary(S: AnsiString);
  var
    i: Integer;
    Dmy: AnsiString;
  begin
    Dmy := #$0D#$0A;
    for i:=1 to Length(S) do
      begin
        Dmy := Dmy + Format('%.2x', [Ord(S[i])]);
        if i < Length(S) then
          Dmy := Dmy + ',';
      end;
    ShowMessage(S + Dmy);
  end;
begin
  // RightStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := RightStr(U8, 5);              // #$E5#$B1#$8B#$43#$44 (NG)
  ShowBinary(U8);

  // AnsiRightStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := AnsiRightStr(U8, 5);          // #$E9#$87#$8E#$E5#$B1#$8B#$43#$44 (NG)
  ShowBinary(U8);

  // MecsRightStr
  U8 := 'AB' + #$F0#$A0#$AE#$B7 + #$E9#$87#$8E + #$E5#$B1#$8B + 'CD';
  U8 := MecsRightStr(U8, 5, CP_UTF8); // #$F0#$A0#$AE#$B7 #$E9#$87#$8E #$E5#$B1#$8B #$43 #$44
  ShowBinary(U8);
end;

関連情報:

MecsStrCharLength 関数

MecsStrCharLength 関数は文字の長さをエレメント数で返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsStrCharLength(const Str: PAnsiChar): Integer;
  function MecsStrCharLength(const Str: PAnsiChar; CodePage: DWORD): Integer;
  function MecsStrCharLength(const Str: PUnicodeChar): Integer;
 
Delphi 2007 の構文:
  function MecsStrCharLength(const Str: PAnsiChar): Integer;
  function MecsStrCharLength(const Str: PAnsiChar; CodePage: DWORD): Integer;
  function MecsStrCharLength(const Str: PWideChar): Integer;
 
説明:
  MecsStrCharLength 関数は、Str の最初の文字のサイズをエレメント単位で返します。
 
  PAnsiChar 版を使う際には CodePage を設定し、コードページを強制すべきです。何故なら、Delphi 2009 / 2010 であっても PAnsiChar(が指す先の文字列) のコードページを自動的に知る事はできないからです。
 
  RTL の StrCharLength に相当する機能です。
 
関連情報:

MecsStrElementType 関数

MecsStrElementType 関数は文字列が 1 エレメントで 1 文字のエレメント, 2 エレメントで 1 文字の場合の最初のエレメント, 2 番目以降のエレメントのいずれであるかを示します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsStrElementType(const Str: PAnsiChar; Index: Cardinal): TElementType;
  function MecsStrElementType(const Str: PAnsiChar; Index: Cardinal; CodePage: DWORD): TElementType;
  function MecsStrElementType(const Str: PUnicodeChar; Index: Cardinal): TElementType;
 
Delphi 2007 の構文:
  function MecsStrElementType(const Str: PAnsiChar; Index: Cardinal): TElementType;
  function MecsStrElementType(const Str: PAnsiChar; Index: Cardinal; CodePage: DWORD): TElementType;
  function MecsStrElementType(const Str: PWideChar; Index: Cardinal): TElementType;
 
説明:
  MecsStrElementType 関数を呼び出すと、Index パラメータで指定されるエレメントの種類がわかります。Index は、0 が文字列 Str の最初のエレメントを指定し、1 が 2 番目のエレメントを指定するといった具合になります。
 
  PAnsiChar 版において、マルチバイト文字セット (MBCS) を使わない環境では、ElementType は必ず etSingle を返します。それ以外の場合、ElementType は、指定されたエレメント (バイト) が完全な 1 文字を表すときに etSingle、2 バイト文字の最初のバイトを表すときに etLead、マルチバイト文字の 2 番目のバイトを表すときに etTrail を返します。
 
  PUnicodeChar / PWideChar 版において、サロゲートペアを使わない環境では、ElementType は必ず etSingle を返します。それ以外の場合、ElementType は、指定されたエレメント (ワード) が完全な 1 文字を表すときに etSingle、サロゲートペアの最初のワードを表すときに etLead、サロゲートペアの 2 番目のワードを表すときに etTrail を返します。
 
TElementType 説明
etSingle 1 つのエレメントで構成される文字。
etLead 2 つ以上のエレメントで構成される文字の最初のエレメント。
etTrail 2 つ以上のエレメントで構成される文字の2 つ目以降のエレメント。
 
  PAnsiChar 版を使う際には CodePage を設定し、コードページを強制すべきです。何故なら、Delphi 2009 / 2010 であっても PAnsiChar(が指す先の文字列) のコードページを自動的に知る事はできないからです。
 
  RTL の StrByteType に相当する機能です。
 
メモ:
  Index が Str の長さを超えないようにするためのチェックは行われません。開発者側の操作で Index を範囲内に収めてください。
 
関連情報:

MecsStrLen 関数

MecsStrLen 関数は文字列内のヌルターミネータを除いた文字数を返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsStrLen(const Str: PAnsiChar): Cardinal;
  function MecsStrLen(const Str: PAnsiChar; CodePage: DWORD): Cardinal;
  function MecsStrLen(const Str: PUnicodeChar): Cardinal;
 
Delphi 2007 の構文:
  function MecsStrLen(const Str: PAnsiChar): Cardinal;
  function MecsStrLen(const Str: PAnsiChar; CodePage: DWORD): Cardinal;
  function MecsStrLen(const Str: PWideChar): Cardinal;
 
説明:
  MecsStrLen 関数は文字列内のヌルターミネータを除いた文字数を返します。
 
  PAnsiChar 版を使う際には CodePage を設定し、コードページを強制すべきです。何故なら、Delphi 2009 / 2010 であっても PAnsiChar(が指す先の文字列) のコードページを自動的に知る事はできないからです。
 
  RTL の StrLen に相当する機能です。マルチバイト文字 / サロゲートペア が考慮されます。
 
関連情報:

MecsStrNextChar 関数

MecsStrNextChar 関数は次の文字を指すポインタを返します。
 
分野の指定
Common ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsStrNextChar(const Str: PAnsiChar): PAnsiChar;
  function MecsStrNextChar(const Str: PAnsiChar; CodePage: DWORD): PAnsiChar;
  function MecsStrNextChar(const Str: PUnicodeChar): PUnicodeChar;
 
Delphi 2007 の構文:
  function MecsStrNextChar(const Str: PAnsiChar): PAnsiChar;
  function MecsStrNextChar(const Str: PAnsiChar; CodePage: DWORD): PAnsiChar;
  function MecsStrNextChar(const Str: PWideChar): PWideChar;
 
説明:
  MecsStrNextChar 関数は、Str の 2 番目の文字を指すポインタを返します。
 
  PAnsiChar 版を使う際には CodePage を設定し、コードページを強制すべきです。何故なら、Delphi 2009 / 2010 であっても PAnsiChar(が指す先の文字列) のコードページを自動的に知る事はできないからです。
 
  RTL の StrNextChar に相当する機能です。
 
関連情報:

MecsCCSLength 関数

MecsCCSLength 関数は文字で使われるエレメント数を返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsCCSLength(const S: UnicodeString; Index: Integer): Integer;
  function MecsCCSLength(const S: WideString; Index: Integer): Integer;

Delphi 2007 の構文:
  function MecsCCSLength(const S: WideString; Index: Integer): Integer;

説明:
  MecsCCSLength 関数を呼び出すと、S の Index 位置にある文字のサイズがエレメント単位でわかります。エレメントは文字を構成する要素で、UnicodeString / WideString なら WideChar となります。
 
サンプルコード:
UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
バイナリ (UTF-16) 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x304B 0x3099 0x0043 0x0044
コードポイント U+0041 U+0042 U+20BB7 U+91CE U+5C4B U+304B U+3099 U+0043 U+0044
文字インデックス 1 2 3 4 5 6 7 8 9
文字 A B 𠮷 C D
結合文字列インデックス 1 2 3 4 5 6 7 8
結合文字列 A B 𠮷 が C D
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsCCSLength(U, 2); // 1
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSLength(U, 3); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSLength(U, 6); // 2
  ShowMessage(IntToStr(Idx));
end;
 
// Delphi 2007/2009 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsCCSLength(W, 2); // 1
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSLength(W, 3); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSLength(W, 6); // 2
  ShowMessage(IntToStr(Idx));
end;
 
  MecsCharLength の結合文字列対応版です。 
 

MecsCCSToElementIndex 関数

MecsCCSToElementIndex 関数は文字列内の指定された文字の最初のエレメントを 1 から始まるインデックスで返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsCCSToElementIndex(const S: UnicodeString; Index: Integer): Integer;
  function MecsCCSToElementIndex(const S: WideString; Index: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsCCSToElementIndex(const S: WideString; Index: Integer): Integer;
 
説明:
  MecsCCSToElementIndex 関数を呼び出すと、文字列 S の指定された位置にある文字のエレメントオフセットを取得できます。1 は最初の文字、2 は 2 番目の文字を指定します。 MecsCCSToElementIndex は、Index が範囲外の場合 (Index <= 0 または S の文字数が Index より小さい) にゼロを返します。Index パラメータが サロゲートペア や 結合文字列 を示す場合、 MecsCCSToElementIndex は最初のエレメントのオフセットを返します。
 
  端的に言えば、MecsCCSToElementIndex は文字インデックスから、文字の先頭に位置するエレメントのインデックスを取得する関数です。
 
サンプルコード:
UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
バイナリ (UTF-16) 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x304B 0x3099 0x0043 0x0044
コードポイント U+0041 U+0042 U+20BB7 U+91CE U+5C4B U+304B U+3099 U+0043 U+0044
文字インデックス 1 2 3 4 5 6 7 8 9
文字 A B 𠮷 C D
結合文字列インデックス 1 2 3 4 5 6 7 8
結合文字列 A B 𠮷 が C D
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsCCSToElementIndex(U, 2); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSToElementIndex(U, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSToElementIndex(U, 6); // 7
  ShowMessage(IntToStr(Idx));
end;
 
// Delphi 2007/2009 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsCCSToElementIndex(W, 2); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSToElementIndex(W, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSToElementIndex(W, 6); // 7
  ShowMessage(IntToStr(Idx));
end;
 
  MecsCharToElementIndex の結合文字列対応版です。 
 

MecsCCSToElementLen 関数

MecsCCSToElementLen 関数は文字列の最初の MaxLen の文字の長さをエレメント数で返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsCCSToElementLen(const S: UnicodeString; MaxLen: Integer): Integer;
  function MecsCCSToElementLen(const S: WideString; MaxLen: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsCCSToElementLen(const S: WideString; MaxLen: Integer): Integer;
 
説明:
  MecsCCSToElementLen 関数を呼び出すと、文字列の文字単位の長さをそれに対応するエレメント単位の長さに変換できます。MecsCCSToElementLen は、S の最初の MaxLen 数の文字で必要なエレメント数を返します。S が MaxLen より小さい場合、CharToByteLen は S の長さをエレメント数で返します。
 
  端的に言えば、MecsCCSToElementLen は文字インデックスから、文字の最後に位置するエレメントのインデックス...つまり、文字単位で考えて"キリのいいエレメント数"を取得する関数です。エレメントを文字単位で区切って処理する際に利用します。
 
サンプルコード:
UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
バイナリ (UTF-16) 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x304B 0x3099 0x0043 0x0044
コードポイント U+0041 U+0042 U+20BB7 U+91CE U+5C4B U+304B U+3099 U+0043 U+0044
文字インデックス 1 2 3 4 5 6 7 8 9
文字 A B 𠮷 C D
結合文字列インデックス 1 2 3 4 5 6 7 8
結合文字列 A B 𠮷 が C D
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsCCSToElementLen(U, 2); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSToElementLen(U, 4); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSToElementLen(U, 8); // 7
  ShowMessage(IntToStr(Idx));
end;
 
// Delphi 2007/2009 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsCCSToElementLen(W, 2); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSToElementLen(W, 4); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsCCSToElementLen(W, 8); // 7
  ShowMessage(IntToStr(Idx));
end;
 
  MecsCharToElementLen の結合文字列対応版です。 
 

MecsCombiningType 関数

MecsCombiningType 関数は文字が 基底文字 / 結合文字 のどちらであるかを判断します。
 
分野の指定
結合文字列 ルーチン
 
Delphi の構文:
  function MecsCombiningType(U: UCS4Char): TCombiningType;
 
説明:
  MecsCombiningType 関数は U に指定した Unicode コードポイントで表される文字が 基底文字 / 結合文字 のどちらであるかを判断します。戻り値は以下のようになります。
 
TCombiningType 説明
ctBase 基底文字
ctCombining 結合文字
 

MecsCopyC 関数

MecsCopyC 関数は文字列の部分文字列を返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsCopyC(const S: UnicodeString; Index, Count: Integer): UnicodeString;
  function MecsCopyC(const S: WideString; Index, Count: Integer): WideString;
 
Delphi 2007 の構文:
  function MecsCopyC(const S: WideString; Index, Count: Integer): WideString;
 
説明:
  MecsCopyC 関数は文字列の部分文字列を返します。S は、文字列型の式です。Index と Count は整数型の式です。MecsCopyC 関数は、S の Index 文字目から Count 個の文字の入った部分文字列を返します。
 
  Index が S より長い場合、MecsCopyC は空の文字列を返します。コピーできる文字より多い値が Count に指定されている場合、S の Index 文字目 から S の終わりまでの文字が返されます。  
 
  動的配列はサポートしません。MecsCopy の結合文字列対応版です。 
 

MecsDeleteC 手続き

MecsDeleteC 手続きは文字列から部分文字列を削除します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  procedure MecsDeleteC(var S: UnicodeString; Index, Count: Integer);
  procedure MecsDeleteC(var S: WideString; Index, Count: Integer);
 
Delphi 2007 の構文:
  procedure MecsDeleteC(var S: WideString; Index, Count: Integer);
 
説明:
  MecsDeleteC 手続きは、文字列 S の Index 文字目から始まる Count 個の文字の部分文字列を削除します。S は文字列型の変数です。Index と Count は整数型の式です。
 
  index が文字列の長さより大きい場合、または 1 未満の場合は、削除は行われません。
 
  Count が index 以降の文字数より大きい場合、MecsDeleteC は終わりまでのすべての文字を削除します。count が 0 以下の場合は、削除は行われません。  
 
  MecsDelete の結合文字列対応版です。 
 

MecsElementToCCSIndex 関数

MecsElementToCCSIndex 関数は文字列内の指定されたエレメントを含む文字の位置を返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsElementToCCSIndex(const S: UnicodeString; Index: Integer): Integer;
  function MecsElementToCCSIndex(const S: WideString; Index: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsElementToCCSIndex(const S: WideString; Index: Integer): Integer;
 
説明:
  MecsElementToCCSIndex 関数を呼び出すと、文字列内で特定のエレメントを含んでいる文字がわかります。1 は最初のエレメント、2 は 2 番目のエレメントを指定します。Index パラメータが 文字列変数にないエレメントを指定する場合 (Index < 0 または Index > Length(S)) 、MecsElementToCCSIndex は 0 を返します。
 
  端的に言えば、MecsElementToCCSIndex はエレメントインデックスから、そのエレメントを含む文字のインデックスを返す関数です。
 
サンプルコード:
UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
バイナリ (UTF-16) 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x304B 0x3099 0x0043 0x0044
コードポイント U+0041 U+0042 U+20BB7 U+91CE U+5C4B U+304B U+3099 U+0043 U+0044
文字インデックス 1 2 3 4 5 6 7 8 9
文字 A B 𠮷 C D
結合文字列インデックス 1 2 3 4 5 6 7 8
結合文字列 A B 𠮷 が C D
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsElementToCCSIndex(U, 2); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCCSIndex(U, 4); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCCSIndex(U, 8); // 6
  ShowMessage(IntToStr(Idx));
end;
 
// Delphi 2007/2009 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsElementToCCSIndex(W, 2); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCCSIndex(W, 4); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCCSIndex(W, 8); // 6
  ShowMessage(IntToStr(Idx));
end;
 
  MecsElementToCharIndex の結合文字列対応版です。 
 

MecsElementToCCSLen 関数

MecsElementToCCSLen 関数は文字列の最初の MaxLen エレメントに含まれている文字数を返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsElementToCCSLen(const S: UnicodeString; MaxLen: Integer): Integer;
  function MecsElementToCCSLen(const S: WideString; MaxLen: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsElementToCCSLen(const S: WideString; MaxLen: Integer): Integer;
 
説明:
  MecsElementToCCSLen 関数を呼び出すと、文字列の部分的な文字数がわかります。MecsElementToCCSLen は MaxLen エレメントまたは文字列の最後のどちらか先に達する方までの文字数をカウントします。
 
  端的に言えば、MecsElementToCCSLen はエレメントインデックスから文字列長を返す関数です。
 
サンプルコード:
UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
バイナリ (UTF-16) 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x304B 0x3099 0x0043 0x0044
コードポイント U+0041 U+0042 U+20BB7 U+91CE U+5C4B U+304B U+3099 U+0043 U+0044
文字インデックス 1 2 3 4 5 6 7 8 9
文字 A B 𠮷 C D
結合文字列インデックス 1 2 3 4 5 6 7 8
結合文字列 A B 𠮷 が C D
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsElementToCCSLen(U, 2); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCCSLen(U, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCCSLen(U, 7); // 6
  ShowMessage(IntToStr(Idx));
end;
 
// Delphi 2007/2009 での例
var
  W: WideString;
  Idx: Integer;
begin
  W := 'AB' + #$D842#$DFB7 + '野屋' + #$304B#$3099 + 'CD';

  Idx := MecsElementToCCSLen(W, 2); // 2
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCCSLen(W, 3); // 3
  ShowMessage(IntToStr(Idx));
  Idx := MecsElementToCCSLen(W, 7); // 6
  ShowMessage(IntToStr(Idx));
end;
 
  MecsElementToCharLen の結合文字列対応版です。 
 

MecsInsertC 手続き

MecsInsertC 手続きは部分文字列を文字列の指定された位置に挿入します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  procedure MecsInsertC(const Source: UnicodeString; var S: UnicodeString; Index: Integer);
  procedure MecsInsertC(const Source: WideString; var S: WideString; Index: Integer);
 
Delphi 2007 の構文:
  procedure MecsInsertC(const Source: WideString; var S: WideString; Index: Integer);
 
説明:
  MecsInsertC 手続きは Source を S に index 文字目の位置から挿入します。
 
  Source は文字列型の式です。S は任意の長さの文字列型の変数です。Index は整数型の式です。Index は文字インデックスです。
 
  Index が 1 未満の場合、Index は 1 にマップされます。Index が文字列の最後を過ぎている場合、Index は文字列の長さに設定され、操作が追加に変わります。
 
  Source パラメータが空の文字列の場合、Insert は何もしません
 
  MecsInsert の結合文字列対応版です。 
 

MecsLeftStrC 関数

MecsLeftStrC 関数は文字列の最初に表示される指定された長さの部分文字列を返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsLeftStrC(const AText: UnicodeString; const ACount: Integer): UnicodeString;
  function MecsLeftStrC(const AText: WideString; const ACount: Integer): WideString;
 
Delphi 2007 の構文:
  function MecsLeftStrC(const AText: WideString; const ACount: Integer): WideString;
 
説明:
  MecsLeftStrC 関数は、AText の先頭から ACount で指定された文字数以内の文字数を返します。
 
サンプルコード:
UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
バイナリ (UTF-16) 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x304B 0x3099 0x0043 0x0044
コードポイント U+0041 U+0042 U+20BB7 U+91CE U+5C4B U+304B U+3099 U+0043 U+0044
文字インデックス 1 2 3 4 5 6 7 8 9
文字 A B 𠮷 C D
結合文字列インデックス 1 2 3 4 5 6 7 8
結合文字列 A B 𠮷 が C D
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  // LeftStr
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := LeftStr(U, 6);
  ShowMessage(U);                 // AB𠮷野屋

  // MecsLeftStr
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MecsLeftStr(U, 6);
  ShowMessage(U);                 // AB𠮷野屋か

  // MecsLeftStrC
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MecsLeftStrC(U, 6);
  ShowMessage(U);                 // AB𠮷野屋が
end;
 
// Delphi 2007/2009 での例
var
  W: WideString;
  Idx: Integer;
begin
  // LeftStr
  W := 'AB' + #$D842#$DFB7 + '野屋' + #$304B#$3099 + 'CD';
  W := LeftStr(W, 6);
  ShowMessage(W);                 // AB𠮷野屋

  // MecsLeftStr
  W := 'AB' + #$D842#$DFB7 + '野屋' + #$304B#$3099 + 'CD';
  W := MecsLeftStr(W, 6);
  ShowMessage(W);                 // AB𠮷野屋か

  // MecsLeftStrC
  W := 'AB' + #$D842#$DFB7 + '野屋' + #$304B#$3099 + 'CD';
  W := MecsLeftStrC(W, 6);
  ShowMessage(W);                 // AB𠮷野屋が
end;
 
  MecsLeftStr の結合文字列対応版です。 
 

MecsLengthC 関数

MecsLengthC 関数は文字列内の文字数を返します
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsLengthC(const S: UnicodeString): Integer;
  function MecsLengthC(const S: WideString): Integer;
 
Delphi 2007 の構文:
  function MecsLengthC(const S: WideString): Integer;
 
説明:
  MecsLengthC 関数は文字列内の文字数を返します。動的配列はサポートされません。
 
  MecsLength の結合文字列対応版です。 
 

MecsMidStrC 関数

MecsMidStrC 関数は文字列内の指定された部分に表示される、指定された長さの部分文字列を返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsMidStrC(const AText: UnicodeString; const AStart, ACount: Integer): UnicodeString;
  function MecsMidStrC(const AText: WideString; const AStart, ACount: Integer): WideString;
 
Delphi 2007 の構文:
  function MecsMidStrC(const AText: WideString; const AStart, ACount: Integer): WideString;
 
説明:
  MecsMidStrC は、AText の AStart 文字目から Count プロパティで指定した文字数の部分文字列を返します。
 
  もし AStart が AText 文字列の長さよりも大きい場合、MidStr 関数は空文字列を返します。
 
  Count が有効な文字数以上の値を指定している場合は、AText の AStart 文字目から AText の最後までの文字のみが返されます。
 
サンプルコード:
UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
バイナリ (UTF-16) 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x304B 0x3099 0x0043 0x0044
コードポイント U+0041 U+0042 U+20BB7 U+91CE U+5C4B U+304B U+3099 U+0043 U+0044
文字インデックス 1 2 3 4 5 6 7 8 9
文字 A B 𠮷 C D
結合文字列インデックス 1 2 3 4 5 6 7 8
結合文字列 A B 𠮷 が C D
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  // MidStr
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MidStr(U, 34);
  ShowMessage(U);                 // 𠮷野屋

  // MecsMidStr
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MecsMidStr(U, 34);
  ShowMessage(U);                 // 𠮷野屋か

  // MecsMidStrC
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MecsMidStrC(U, 34);
  ShowMessage(U);                 // 𠮷野屋が
end;
 
// Delphi 2007/2009 での例
var
  W: WideString;
  Idx: Integer;
begin
  // MidStr
  W := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  W := MidStr(W, 34);
  ShowMessage(W);                 // 𠮷野屋

  // MecsMidStr
  W := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  W := MecsMidStr(W, 34);
  ShowMessage(W);                 // 𠮷野屋か

  // MecsMidStrC
  W := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  W := MecsMidStrC(W, 34);
  ShowMessage(W);                 // 𠮷野屋が
end;
 
  MecsMidStr の結合文字列対応版です。 
 

MecsNextCCSIndex 関数

MecsNextCCSIndex 関数は次の文字のエレメントインデックスを返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsNextCCSIndex(const S: UnicodeString; Index: Integer): Integer;
  function MecsNextCCSIndex(const S: WideString; Index: Integer): Integer;
 
Delphi 2007 の構文:
  function MecsNextCCSIndex(const S: WideString; Index: Integer): Integer;
 
説明:
  MecsNextCCSIndex は、Index 文字目から始まる文字に続く文字の最初のエレメントのエレメントインデックスを返します。
 
  MecsNextCharIndex の結合文字列対応版です。 
 

MecsReverseStringC 関数

MecsReverseStringC 関数は指定した文字列の向きを逆にしたものを返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsReverseStringC(const AText: UnicodeString): UnicodeString;
  function MecsReverseStringC(const AText: WideString): WideString;
 
Delphi 2007 の構文:
  function MecsReverseStringC(const AText: WideString): WideString;
 
説明:
  MecsReverseStringC 関数は、AText で指定した値の文字を逆向きに配置したものを返します。
 
  MecsReverseString の結合文字列対応版です。 
 

MecsRightStrC 関数

MecsRightStrC 関数は文字列の最後に表示される指定された長さの部分文字列を返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsRightStrC(const AText: UnicodeString; const ACount: Integer): UnicodeString;
  function MecsRightStrC(const AText: WideString; const ACount: Integer): WideString;
 
Delphi 2007 の構文:
  function MecsRightStrC(const AText: WideString; const ACount: Integer): WideString;
 
説明:
  MecsRightStrC 関数は、AText の末尾から ACount 以内の文字数を返します。
 
サンプルコード:
UnicodeString / WideString
エレメントインデックス 1 2 3 4 5 6 7 8 9 10
バイナリ (UTF-16) 0x0041 0x0042 0xD842 0xDFB7 0x91CE 0x5C4B 0x304B 0x3099 0x0043 0x0044
コードポイント U+0041 U+0042 U+20BB7 U+91CE U+5C4B U+304B U+3099 U+0043 U+0044
文字インデックス 1 2 3 4 5 6 7 8 9
文字 A B 𠮷 C D
結合文字列インデックス 1 2 3 4 5 6 7 8
結合文字列 A B 𠮷 が C D
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  // RightStr
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := RightStr(U, 6);
  ShowMessage(U);                 // 野屋がCD

  // MecsRightStr
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MecsRightStr(U, 6);
  ShowMessage(U);                 // 野屋がCD

  // MecsRightStrC
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MecsRightStrC(U, 6);
  ShowMessage(U);                 // 𠮷野屋がCD
end;
 
// Delphi 2009 / 2010 での例
var
  U: UnicodeString;
  Idx: Integer;
begin
  // RightStr
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := RightStr(U, 6);
  ShowMessage(U);                 // 野屋がCD

  // MecsRightStr
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MecsRightStr(U, 6);
  ShowMessage(U);                 // 野屋がCD

  // MecsRightStrC
  U := 'AB' + #$20BB7 + '野屋' + #$304B#$3099 + 'CD';
  U := MecsRightStrC(U, 6);
  ShowMessage(U);                 // 𠮷野屋がCD
end;
 
  MecsRightStr の結合文字列対応版です。 
 

MecsStrCCSLength 関数

MecsStrCCSLength 関数は文字の長さをエレメント数で返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsStrCCSLength(const Str: PUnicodeChar): Integer;
 
Delphi 2007 の構文:
  function MecsStrCCSLength(const Str: PWideChar): Integer;
 
説明:
  MecsStrCCSLength 関数は、Str の最初の文字のサイズをエレメント単位で返します。
 
  MecsStrCharLength の結合文字列対応版です。 
 

MecsStrLenC 関数

MecsStrLenC 関数は文字列内のヌルターミネータを除いた文字数を返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsStrLenC(const Str: PUnicodeChar): Cardinal;
 
Delphi 2007 の構文:
  function MecsStrLenC(const Str: PWideChar): Cardinal;
 
説明:
  MecsStrLenC 関数は文字列内のヌルターミネータを除いた文字数を返します。
 
  MecsStrLen の結合文字列対応版です。 
 

MecsStrNextCCS 関数

MecsStrNextCCS 関数は次の文字を指すポインタを返します。
 
分野の指定
結合文字列 ルーチン
 
Delphi 2009 / 2010 の構文:
  function MecsStrNextCCS(const Str: PUnicodeChar): PUnicodeChar;
 
Delphi 2007 の構文:
  function MecsStrNextCCS(const Str: PWideChar): PWideChar;
 
説明:
  MecsStrNextCCS 関数は、Str の 2 番目の文字を指すポインタを返します。
 
  MecsStrNextChar の結合文字列対応版です。 
 

AnsiToUTF32 関数

AnsiToUTF32 関数は Ansi 文字列を UTF-32 に変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function AnsiToUTF32(const AText: RawByteString; CodePage: DWORD): UCS4String;
  function AnsiToUTF32(const AText: RawByteString): UCS4String;
 
Delphi 2007 の構文:
  function AnsiToUTF32(const AText: AnsiString; CodePage: DWORD): UCS4String;
  function AnsiToUTF32(const AText: AnsiString): UCS4String;
 
説明:
  AnsiToUTF32 関数は Ansi 文字列を UTF-32 に変換します。
 
  CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
関連情報:

AnsiToUTF16 関数

AnsiToUTF16 関数は Ansi 文字列を UTF-16 (Unicode) に変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function AnsiToUTF16(const AText: RawByteString; CodePage: DWORD): WideString;
  function AnsiToUTF16(const AText: RawByteString): WideString;
 
Delphi 2007 の構文:
  function AnsiToUTF16(const AText: AnsiString; CodePage: DWORD): WideString;
  function AnsiToUTF16(const AText: AnsiString): WideString;
 
説明:
  AnsiToUTF16 関数は Ansi 文字列を UTF-16 (Unicode) に変換します。
 
  CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
関連情報:

AnsiToUTF8 関数

AnsiToUTF8 関数は Ansi 文字列を UTF-8 に変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function AnsiToUTF8(const AText: RawByteString; CodePage: DWORD): UTF8String;
  function AnsiToUTF8(const AText: RawByteString): RawByteString;
 
Delphi 2007 の構文:
  function AnsiToUTF8(const AText: AnsiString; CodePage: DWORD): UTF8String;
  function AnsiToUTF8(const AText: AnsiString): UTF8String;
 
説明:
  AnsiToUTF8 関数は Ansi 文字列を UTF-8 に変換します。
 
  CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の AnsiToUtf8 に相当する機能です。
 
関連情報:

CodePointToUTF16 関数

CodePointToUTF16 関数は Unicode のコードポイントから UTF-16 (Unicode) へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi の構文:
  function CodePointToUTF16(const UCS4: UCS4Char): WideString;
 
説明:
  CodePointToUTF16 関数は Unicode のコードポイントから UTF-16 (Unicode) へ変換します。
 
関連情報:

CodePointToUTF8 関数

CodePointToUTF8 関数は Unicode のコードポイントから UTF-8 へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function CodePointToUTF8(const UCS4: UCS4Char): RawByteString;
 
Delphi 2007 の構文:
  function CodePointToUTF8(const UCS4: UCS4Char): UTF8String;
 
説明:
  CodePointToUTF8 関数は Unicode のコードポイントから UTF-8 へ変換します。
 
関連情報:

ConvertMultiByteToUnicode 関数

ConvertMultiByteToUnicode 関数は Ansi 文字列を Unicode (UTF-16) へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function ConvertMultiByteToUnicode(SrcCodePage: DWORD; const SrcStr: RawByteString; var DstStr: WideString): Boolean;
 
Delphi 2007 の構文:
  function ConvertMultiByteToUnicode(SrcCodePage: DWORD; const SrcStr: AnsiString; var DstStr: WideString): Boolean;
 
説明:
  ConvertMultiByteToUnicode 関数は Ansi 文字列を Unicode (UTF-16) へ変換します。
 
  AnsiToUTF16 との違いについてですが、
 
// Delphi 2009 / 2010 での例
var
  SL: TStringList;
  Enc: TEncoding;
begin
  SL := TstringList.Create;
  Enc := TEncoding.GetEncoding(51932);
  try
    SL.LoadFromFile('C:\CP51932.TXT', Enc);
    ShowMessage(SL.Text);
  finally
    Enc.Free;
    SL.Free;
  end;
end;
 
  このコードは "コードページが不正" のエラーが出て、CP51932 (EUC-JP) を変換できませんが、
 
// Delphi 2009 / 2010 での例
var
  FS: TFileStream;
  EUC: RawByteString;
  S: WideString;
  r: Integer;
begin
  FS := TFileStream.Create('C:\CP51932.TXT', fmOpenRead);
  try
    SetLength(EUC, FS.Size);
    FS.ReadBuffer(PAnsiChar(EUC)^, FS.Size);
    if ConvertMultiByteToUnicode(51932, EUC, S) then
      ShowMessage(S);
  finally
    FS.Free;
  end;
end;
 
  ConvertUnicodeToMultiByte() を使えば、CP51932 (EUC-JP) を利用する事が可能です。
 
関連情報:

ConvertString 関数

ConvertString 関数は Ansi 文字列を他のコードページの Ansi へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function ConvertString(SrcCodePageDstCodePage: DWORD; const SrcStr: RawByteString; var DstStr: RawByteString): Boolean;
 
Delphi 2007 の構文:
  function ConvertString(SrcCodePageDstCodePage: DWORD; const SrcStr: AnsiString; var DstStr: AnsiString): Boolean;
 
説明:
  ConvertString 関数は Ansi 文字列を他のコードページの Ansi へ変換します。他方の Ansi コードページに存在しない文字は失われるか、代替文字で置換される可能性があります。
 
関連情報:

ConvertUnicodeToMultiByte 関数

ConvertUnicodeToMultiByte 関数は Unicode (UTF-16) 文字列を Ansi へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function ConvertUnicodeToMultiByte(DstCodePage: DWORD; const SrcStr: WideString; var DstStr: RawByteString): Boolean;
 
Delphi 2007 の構文:
  function ConvertUnicodeToMultiByte(DstCodePage: DWORD; const SrcStr: WideString; var DstStr: AnsiString): Boolean;
 
説明:
  ConvertUnicodeToMultiByte 関数は Unicode (UTF-16) 文字列を Ansi へ変換します。Unicode に存在し、Ansi に存在しない文字は失われます。
 
  UTF16ToAnsi との違いについてですが、
 
// Delphi 2009 / 2010 での例
var
  SL: TStringList;
  Enc: TEncoding;
begin
  SL := TstringList.Create;
  Enc := TEncoding.GetEncoding(51932);
  try
    SL.Text := 'あいうえお';
    SL.SaveToFile('C:\CP51932.TXT', Enc);
  finally
    Enc.Free;
    SL.Free;
  end;
end;
 
  このコードは "コードページが不正" のエラーが出て、CP51932 (EUC-JP) を変換できませんが、
 
// Delphi 2009 / 2010 での例
var
  FS: TFileStream;
  EUC: RawbyteString;
begin
  if ConvertUnicodeToMultiByte(51932'あいうえお' , EUC) then
    begin
      FS := TFileStream.Create('C:\CP51932.TXT', fmCreate);
      try
        FS.WriteBuffer(PAnsiChar(EUC)^, Length(EUC));
      finally
        FS.Free;
      end;
    end;
end;
 
  ConvertUnicodeToMultiByte() を使えば、CP51932 (EUC-JP) を利用する事が可能です。
 
関連情報:

UTF32ToAnsi 関数

UTF32ToAnsi 関数は UTF-32 文字列を Ansi へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function UTF32ToAnsi(const UCS4Text: UCS4String; CodePage: DWORD): RawByteString;
  function UTF32ToAnsi(const UCS4Text: UCS4String): RawByteString;
 
Delphi 2007 の構文:
  function UTF32ToAnsi(const UCS4Text: UCS4String; CodePage: DWORD): AnsiString;
  function UTF32ToAnsi(const UCS4Text: UCS4String): AnsiString;
 
説明:
  UTF32ToAnsi 関数は UTF-32 文字列を Ansi へ変換します。Unicode に存在し、Ansi に存在しない文字は失われます。
 
  CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
関連情報:

UTF32ToUTF16 関数

UTF32ToUTF16 関数は UTF-32 文字列を UTF-16 (Unicode) へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function UTF32ToUTF16(const UCS4Text: UCS4String): WideString;
 
説明:
  UTF32ToUTF16 関数は UTF-32 文字列を UTF-16 (Unicode) へ変換します。
 
  RTL の UCS4StringToWideString、Delphi 2009 / 2010-RTL の UCS4StringToUnicodeString に相当する機能ですが、Delphi 2007 版の UCS4StringToWideString と違い、サロゲートペアを正しく処理します。
 
関連情報:

UTF32ToUTF8 関数

UTF32ToUTF8 関数は UTF-32 文字列を UTF-8 へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function UTF32ToUTF8(const UCS4Text: UCS4String): RawByteString;
 
Delphi 2007 の構文:
  function UTF32ToUTF8(const UCS4Text: UCS4String): UTF8String;
 
説明:
  UTF32ToUTF8 関数は UTF-32 文字列を UTF-8 へ変換します。
 
関連情報:

UTF16ToAnsi 関数

UTF16ToAnsi 関数は UTF-16 (Unicode) 文字列を Ansi へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function UTF16ToAnsi(const WText: WideString; CodePage: DWORD): RawByteString;
  function UTF16ToAnsi(const WText: WideString): RawByteString;
 
Delphi 2007 の構文:
  function UTF16ToAnsi(const WText: WideString; CodePage: DWORD): AnsiString;
  function UTF16ToAnsi(const WText: WideString): AnsiString;
 
説明:
  UTF16ToAnsi 関数は UTF-16 (Unicode) 文字列を Ansi へ変換します。Unicode に存在し、Ansi に存在しない文字は失われます。
 
  CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
関連情報:

UTF16ToUTF32 関数

UTF16ToUTF32 関数は UTF-16 (Unicode) 文字列を UTF-32 へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi の構文:
  function UTF16ToUTF32(const WText: WideString): UCS4String;
 
説明:
  UTF16ToUTF32 関数は UTF-16 (Unicode) 文字列を UTF-32 へ変換します。
 
  RTL の WideStringToUCS4String、Delphi 2009 / 2010-RTL の UnicodeStringToUCS4String に相当する機能ですが、Delphi 2007 版の WideStringToUCS4String と違い、サロゲートペアを正しく処理します。
 
関連情報:

UTF16ToUTF8 関数

UTF16ToUTF8 関数は UTF-16 (Unicode) 文字列を UTF-8 へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function UTF16ToUTF8(const WText: WideString): RawByteString;
 
Delphi 2007 の構文:
  function UTF16ToUTF8(const WText: WideString): UTF8String;
 
説明:
  UTF16ToUTF8 関数は UTF-16 (Unicode) 文字列を UTF-8 へ変換します。
 
  RTL の UTF8Encode に相当する機能ですが、Delphi 2007 版の UTF8Encode と違い、4 バイト文字 (サロゲートペア) を正しく処理します。
 
関連情報:

UTF8ToAnsi 関数

UTF8ToAnsi 関数は UTF-8 文字列を Ansi へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function UTF8ToAnsi(const UCF8Text: RawByteString; CodePage: DWORD): RawByteString;
  function UTF8ToAnsi(const UCF8Text: RawByteString): RawByteString;
 
Delphi 2007 の構文:
  function UTF8ToAnsi(const UCF8Text: UTF8String; CodePage: DWORD): AnsiString;
  function UTF8ToAnsi(const UCF8Text: UTF8String): AnsiString;
 
説明:
  UTF8ToAnsi 関数は UTF-8 文字列を Ansi へ変換します。Unicode に存在し、Ansi に存在しない文字は失われます。
 
  CodePage を指定することで、コードページを強制する事ができます。コードページを指定しなかった場合には、Delphi 2009 / 2010 の場合には AnsiString のコードページ、Delphi 2007 の場合には MECSUtils.DefaultAnsiCodePage 変数に設定されたコードページ (デフォルトでは規定のコードページ) が使われます。
 
  RTL の Utf8ToAnsi に相当する機能です。
 
関連情報:

UTF8ToUTF32 関数

UTF8ToUTF32 関数は UTF-8 文字列を UTF-32 へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function UTF8ToUTF32(const UCF8Text: RawByteString): UCS4String;
 
Delphi 2007 の構文:
  function UTF8ToUTF32(const UCF8Text: UTF8String): UCS4String;
 
説明:
  UTF8ToUTF32 関数は UTF-8 文字列を UTF-32 へ変換します。
 
関連情報:

UTF8ToUTF16 関数

UTF8ToUTF16 関数は UTF-8 文字列を UTF-16 (Unicode) へ変換します。
 
分野の指定
Convert ルーチン
 
Delphi 2009 / 2010 の構文:
  function UTF8ToUTF16(const UCF8Text: RawByteString): WideString;
 
Delphi 2007 の構文:
  function UTF8ToUTF16(const UCF8Text: UTF8String): WideString;
 
説明:
  UTF8ToUTF16 関数は UTF-8 文字列を UTF-16 (Unicode) へ変換します。
 
  RTL の UTF8Decode に相当する機能ですが、Delphi 2007 版の UTF8Decode と違い、4 バイト文字 (サロゲートペア) を正しく処理します。
 
関連情報:

 BACK