Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
1

TStringList BOM метки

23.10.2014, 01:22. Просмотров 842. Ответов 2
Метки нет (Все метки)

Итак имеем созданный в Notepad++ текстовый файлик

TStringList BOM метки


По скриншоту видно что используется UTF8 кодировка с BOM меткой

Откроем это файл в TStringListUTF8 и бинарно выведем коды символов

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button1Click(Sender: TObject);
var s: TStringListUTF8; i:integer;
begin
   s:=TStringListUTF8.Create;
   s.LoadFromFile('hello.txt');
   for i:=1 to length(s[0]) do begin
     Memo1.Lines.add(inttohex(ord(s[0][i]),2));
   end;
   Memo1.Lines.add(' --- ');
   for i:=1 to length(s[1]) do begin
     Memo1.Lines.add(inttohex(ord(s[1][i]),2));
   end;
 
   s.free;
end;
TStringList BOM метки


И в результате получается что BOM метка присутствует в первой строке в качестве символов!
(выделение на скриншоте)

Это означает что если бы мы сравнивали первую строчку на совпадение 'alex' то ничего бы не вышло.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button1Click(Sender: TObject);
var s: TStringListUTF8; i:integer;
begin
   s:=TStringListUTF8.Create;
   s.LoadFromFile('hello.txt');
   
   { ... }
 
   if (trim(s[0]) = 'alex') then
      memo1.lines.add('ok');  // << сравнение не работает BOM метка мешает обработке
 
   if (pos('alex',s[0]) >0 ) then
      memo1.lines.add('ok2'); // pos работает удачно
 
   s.free;
end;
Что интересно, что если сделать аналогичный пример в Delphi то BOM метка не будет присутствовать в первой строке

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button1Click(Sender: TObject);
var s: TStringList; i:integer;
begin
   s:=TStringList.Create;
   s.LoadFromFile('../hello.txt');
 
   { ... }
   // DELPHI
 
   if (trim(s[0]) = 'alex') then
      memo1.lines.add('ok');  // << сравнение работает
 
   if (pos('alex',s[0]) >0 ) then
      memo1.lines.add('ok2'); // pos работает удачно
 
   s.free;
end;
TStringList BOM метки


Выводы?
Принять эту особенноть BOM меток в лазарусе как должное, либо избавляться от нее после загрузки строкового листа.

Исходники во вложении
0
Вложения
Тип файла: zip laz test UTF8.zip (478.5 Кб, 8 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2014, 01:22
Ответы с готовыми решениями:

TStringList
Столкнулся с проблемой Суть: Имеется список TStringList в который записано...

Вопрос по TStringList
есть такая функция: Function PoluchitSpFile(DurMaska: String): TStringList;...

Сохранение TStringList-а в Unicode
Подскажите пожалуйста, как сделать чтобы TStringList сохранял данные в формате...

Работает ли array of TStringList
Вообще он должен работать? Программа читает файл, открывает его, но такое...

Tstringlist и перенос строки
Приветствую. Появилась проблема, не знаю как решить. Имеется определенный...

2
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26372 / 17695 / 7006
Регистрация: 22.10.2011
Сообщений: 31,148
Записей в блоге: 6
23.10.2014, 02:21 2
Pascal
1
2
     if Pos(UTF8FileHeader, s.Text) = 1 then
        s.Text := UTF8BOMToUTF8(s.Text);
сразу после чтения из файла в TStringListUTF8 - общая практика... Кое-где даже пишут и используют наследника этого класса, который делает это автоматически...
0
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
23.10.2014, 02:50  [ТС] 3
через item[0] быстрее работать не будет ?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var 
s: UTF8String;
list: TStringListUTF8;
begin
    list:=TStringListUTF8.Create;
    list.LoadFromFile('hello.txt');
    // чистка BOM метки
    if list.Count>0 then begin
       s:=list[0];
       if (Pos(UTF8FileHeader,s) = 1) then begin
          System.Delete(s,1,Length(UTF8FileHeader));
          list[0]:=s;
       end;
    end;
    list.free;  
end;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2014, 02:50

TFPHTTPClient.FormPost и TStringList
Здравствуйте. Столкнулся со странным поведением функции TFPHTTPClient.FormPost...

TStringList убрать конец строки
Как убрать конец строки из последней строки TStringList? tmpFile.Strings :=...

Копировать TStringList, отсутствие ошибок у компилятора
Понятно что при var x,y:TStringList; _array of StringList запись x:=y;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru