C++Builder 2007からC++Builder 2009への変更でTStringList#LoadFromFileの動作が変わりました。
文字コードがシフトJIS以外のファイルをTStringList#LoadFromFileで読み込むと、動作の違いにとまどうことになります。
挙動が変わった理由は、TStringListが内部でUnicodeStringでデータを保持するようになったため。
C++Builder 2009では、TStringList#TextやTStringList#StringsがUnicodeStringを返すようになりました。
そのためUnicodeの変換が行われます。
例えば以下のコードでは、次のような文字コード変換が行われます。
# デフォルトANSIコードページがシフトJISと仮定します。
TStringList* file = new TStringList();
// ファイルの文字コードをシフトJISとして読み込み、Unicodeに変換する
file->LoadFromFile("C:\\sample.txt");
// UnicodeをシフトJISに変換する
AnsiString text = file->Text;
2行目の文字コード変換が問題です。
文字列がシフトJIS以外だとしても、シフトJISとして変換されてしまいます。
C++Builder 2009ではLoadFromFileの引数で、ファイルのコードページが指定できるようになっています。
TStringList* list = new TStringList();
TEncoding* encoding = TEncoding::GetEncoding(20932); //euc-jp
list->LoadFromFile("C:\\sample.txt", encoding);
ただし、この方法はあらかじめコードページがわかっている場合にしか使えません。
ファイルを読み込んでから文字コードを判別して…、という場合には違う方法が必要です。