Delphi/400 V2009以降ではString型の文字列がANSIからUnicodeに変更されていますが、
それに伴って文字列操作の関数では処理内の計算が
バイト数単位から文字数単位に変更されているものがいくつか存在します。
<例>
[1]:Copy('株式会社ミガロ', 3, 4);
⇒V2007まではバイト数計算で「式会」が返る
⇒V2009からは文字数計算で「会社ミガ」が返る
[2]:Pos('式', '株式会社ミガロ');
⇒V2007までは3バイト目のため「3」が返る
⇒V2009からは2文字目のため「2」が返る
[3]:Length('株式会社ミガロ');
⇒V2007までは14バイトのため「14」が返る
⇒V2009からは7文字のため「7」が返る
[4]:AnsiPos('式', '株式会社ミガロ');
⇒V2007までは3バイト目のため「3」が返る
⇒V2009からは2文字目のため「2」が返る
[5]:StuffString('株式会社ミガロ', 3, 4, '★');
⇒V2007まではバイト数計算で「株★社ミガロ」が返る
⇒V2009からは文字数計算で「株式★ロ」が返る
上記例の[1][2][3]は引数をAnsiStringでキャストすることで、
V2009以降でもANSI文字列としてバイト数で計算が行われます。
これはDelphiのオリジナルソースに、Unicode用の関数とともに
ANSI用の関数が残されているためです。
<例>
[1]の場合:Copy(AnsiString(‘株式会社ミガロ’), 3, 4);
[2]の場合:Pos(AnsiString(‘式’), AnsiString(‘株式会社ミガロ’));
[3]の場合:Length(AnsiString(‘株式会社ミガロ’));
しかし上記例の[4][5]の場合はANSI用の関数が同じユニットに無いため、
AnsiStringでキャストしても文字数で計算が行われ、結果が変わりません。
そこで使用するのが「System.AnsiStrings」ユニットです。
このユニットには上記[4][5]をはじめとする各文字列操作を行う処理の
ANSI版が集約されており、これを使用することでV2007までと同様の
バイト数計算が可能になります。
<例>
[4]の場合:System.AnsiStrings.AnsiPos(‘式’, ‘株式会社ミガロ’);
[5]の場合:System.AnsiStrings.StuffString(‘株式会社ミガロ’, 3, 4, ‘★’);
※それぞれ、uses節に「System.AnsiStrings」を追加する必要があります。
※V2009・V2010・XEでは、uses節に追加するユニット名が「AnsiStrings」となります。
実装部のロジックも「System.AnsiStrings.~~」ではなく「AnsiStrings.~~」となります。
本記事で紹介した以外にも「System.AnsiStrings」ユニットには
たくさんのAnsiString関連の関数や手続きがありますので、
V2007以前とV2009以降の挙動の差異にお悩みの方は以下のドキュメントもご参照ください。
System.AnsiStrings – RAD Studio API Documentation
(ミガロ.情報マガジン「MIGARO News!!」Vol.227 2020年8月号より)