Delphiで古いプログラムを再利用する場合の関門とは?

Delphiで、199X年開発とか古いプログラムをメンテナンスする場合の最大の関門とは、やはり文字周りかと。Delphi 2007あたりから文字がUnicode化されたため、文字型変数などの扱いが激変している。このあたり、ちょっとわかりにくかったので整理してみた。

文字を格納する変数はChar型である。Char型変数に、1文字収納できる。ただしこの文字とは、いわゆるASCII文字(1バイト)だったのがUnicode(2バイト)になった。なので、たとえば型付きファイルでChar型のデータを扱う場合、昔と今ではサイズが異なって読み出したデータがおかしなことになってしまう。

そこで、現在のDelphi(ブログ主はXE5を使用)ではAnsiChar型という昔のChar型と互換性のある型があり、現在のChar型と互換性のある型としてWideChar型がある。利用はあまり推奨されていないが、それぞれに専用の手続きや関数が用意されている。

AnsiChar:1バイト
WideChar:2バイト
Char=WideChar:2バイト同士

ポインタも同様で、PChar型はPAnsiChar型PWideChar型がある。昔書いていたコードで、CharとPCharを使いまくっている場合、これらを片っ端からAnsiCharとPAnsiCharに書き替える必要がある。ただこれは、上記のように型付きファイルからデータを読み出す場合など、互換性が最大の関心事であるとき以外は避けた方が無難である。

面倒でなければ、プログラム全体をUnicode化した方がよい。もっとも、PCharなんかを使うのは、C言語のライブラリ関数と互換性のあるコードを書こうとか、偏った用途である場合が多いのだが…。

実は、文字よりも文字列はもっと複雑怪奇である。それについては別の機会に…。

コメント