Delphi: TStringList не понимает спецификацию? - PullRequest
1 голос
/ 18 июня 2011

TStringList не понимает спецификацию?

Tf1 := TFileStream.Create(LIGALOG+'liga.log',fmOpenRead or fmShareDenyNone);

str:=tstringlist.Create;
str.LoadFromStream(tf1);

String1:='FStream '+inttostr(tf1.Size)+'/ String: '+(str.Text);

Если текстовый файл сохранен в UTF-8 + BOM, тогда Str.Count=0; Str.Text=''. Без спецификации все в порядке.
Это нормально?

1 Ответ

12 голосов
/ 18 июня 2011

Если вы используете версию Delphi до 2009 года, она не поддерживает Unicode, а спецификация бессмысленна для TStringList.

Если вы используете D2009 или выше (которые поддерживают Unicode),вы можете использовать перегруженный TStringList.LoadFromStream(Stream: TStream; Encoding: TEncoding), если заранее знаете, что такое кодировка;если вы этого не сделаете, RTL попытается выяснить это, используя TEncoding.GetBufferEncoding.Вы можете ознакомиться с документацией по Delphi XE по теме здесь

Если вы не знаете заранее, а RTL не может выяснить это по содержанию, вы можетевсегда читайте спецификацию самостоятельно из потока, а затем установите Stream.Position сразу после спецификации и загрузите TStringList из этой позиции с декодированием, которое вы определяете сами из этой спецификации.

Кроме того, создание TFileStream для простой загрузки в TStringList является пустой тратой;TStringList.LoadFromFile будет обрабатывать сам файл, и это намного меньше кода, если это все, что вы собираетесь делать с TStream.

РЕДАКТИРОВАТЬ: После вашего комментария я подумал, что я бы включил списокиз спецификаций, с которыми я знаком - может быть больше, о чем я не знаю:

$00 $00 $FE $FF  UTF-32, big-endian (bytes must be swapped for Windows)
$FE $FF $00 $00  UTF-32, little-endian
$FF $FE          UTF-16 2 byte chars little-endian
$FE $FF          UTF-16 2 byte big-endian 
$EF $BB $BF      Unicode UTF-8 (must be decoded before using Unicode data)

(Для дальнейшего использования: в тегах или тексте вашего вопроса вы должны указать, какая версияDelphi, который вы используете, поскольку между ними есть различия в VCL и RTL. Когда речь идет о таких вещах, как вопросы типа Unicode / BOM, эти различия чрезвычайно важны.)

...