« AnsiDequotedStrの不具合 | メイン | C++Builder 2009のTStringList#LoadFromFileには、BOMでコードページを自動判別する機能が追加されている »

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

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

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/834

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年10月12日 18:52に投稿されたエントリーのページです。

ひとつ前の投稿は「AnsiDequotedStrの不具合」です。

次の投稿は「C++Builder 2009のTStringList#LoadFromFileには、BOMでコードページを自動判別する機能が追加されている」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35