все что связано с моей работой
Главная » Програмирование » Работа со строками в Lаzarus 3

Работа со строками в Lаzarus 3

Тест 2.

Ковыряясь в исподниках FPC и Lazarus наткнулся на такой модуль LConvEncoding. Модуль содержит кучу функций по перекодировки в/из UTF8 и была там одна особенно интересна. Функция GuessEncoding может определить кодировку исходной строки (правда не для всех кодировок, вероятность где-то 70%). Вот ее и протестируем, новый проект и вот такая форма:

conv1

Начнем по порядку. В FormCreate напишем такое:

procedure TForm1.FormCreate(Sender: TObject);
var S:TStrings;
    i:integer;
begin
  Memo1.Clear;
  // Кодировка в системе по умолчанию
  Memo1.Append('Default - '+GetDefaultTextEncoding);
  // список всех поддерживаемых кодировок
  S:=TStringList.Create;
  try
    GetSupportedEncodings(S);
    Memo1.Append('Supported');
    for i:=0 to S.Count-1 do Memo1.Append(S[i]);
  finally
    FreeAndNil(S);
  end;
end;

Что сотворили… Левый Мемо при создании заполнится списком поддерживаемых кодировок, функция GetSupportedEncodings и первой строкой напишет кодировку в системе по умолчанию – GetDefaultTextEncoding.

Далее напишем обработчик для кнопки:

procedure TForm1.Button3Click(Sender: TObject);
var F:TextFile;
    S:string;
begin
  Memo4.Clear;
  if OD.Execute then begin
    AssignFile(F,UTF8ToSys(OD.FileName));
    Reset(F);
    while not eof(F) do begin
      readln(F,S);
      Memo4.Append(GuessEncoding(S)+'    :'+S) ;
      NormalizeString(S);
      Memo4.Append('to utf8 :'+S);
      Memo4.Append('');
    end;
    CloseFile(F);
  end;
end;

Здесь, открываем выбранный файл и читаем его по строчке. UTF8ToSys – спасает нас если в имени файла есть русские буквы. Далее определяется кодировка GuessEncoding(S) загруженной строки и ввыводится в правый Мемо вместе с исходной строкой. Затем строка преобразуется и снова выводится в Мемо только с пометкой to utf8. Процедура преобразования проста, вынес ее отдельно из эстетических соображений:

procedure NormalizeString(var S:string);
var from:string;
begin
  from:=GuessEncoding(S);
  S:=ConvertEncoding(S,from,EncodingUTF8);
end;

Определить кодировку и перекодировать в уже почти родной UTF8.

Результаты:

Windows Ubuntu

Файл в WIN1251 кодировке:

 
str2 str1251-u

в DOS (866):

 
str3 str866-u

KOI8-R:

str4 strkoi8r-u

UTF-8, тут все предсказуемо:

 
str5 strutf8

и последнее UTF-16:

 
str6 strutf16

Файл в UTF-16 это пока что очень редкий зверь, KOI8-R, попадается чаще, но тоже нельзя сказать что “основная” кодировка, огорчило определение 866-й кодировки и порадовало 1251.  Интересно определяются пустые строки всегда UTF8, но на самом деле они там не пустые, там много “табов” (#9). Исходный файл – выгрузка отчета из 1С, удалил тока суммы, фамилии, и перегнал в разные кодировки. Смысл в том, что части win1251 и UTF8 до 127-го символа совпадают поэтому кодировка определяется как utf8, это видно также на номерах столбцов в таблице. И как не повезло пользователям Ubuntu ни одна из кодировок кроме utf8 не определилась нормально, но для Ubunt-ы utf8 – системная локаль… может поэтому она определилась, для чистоты эксперимента стоило бы сменить локаль на Linux и прогнать программку еще раз. Это оставляю для дотошных читателей.

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.