C++Builder 2009への移植作業 その3 C++Builder 2009におけるTStringList#LoadFromFileの挙動の変化

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);

ただし、この方法はあらかじめコードページがわかっている場合にしか使えません。
ファイルを読み込んでから文字コードを判別して…、という場合には違う方法が必要です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください