Чтение текстовых UTF-16 файлов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

bigbo
незнакомец
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

Чтение текстовых UTF-16 файлов

Сообщение bigbo »

Не могу прочитать нормально текстовый файл.
Оказалось, что файл имеет UTF-16 кодировку.
В делфи даже и не знал об этом, все как-то само работало.

Пробовал загружать строки обычным ListBox.Items.LoadFromFile - не читает.
Переделал так, как ниже, но тоже не работает.

Код: Выделить всё

var
  Form1: TForm1;
  PathToKReport : String;
  file_input : TextFile;

procedure TForm1.OpenFileClick(Sender: TObject);
var
 S: WideString;
begin
  If OpenDialog.Execute then
   begin
     AssignFile(file_input, OpenDialog.FileName);
     Reset(file_input);
     While not eof (file_input) do
     begin
       ReadLn(file_input, S);
       ListBox.Items.Add(UTF16ToUTF8(S));
     end;
     CloseFile(file_input);
     //ListBox.Items.LoadFromFile(OpenDialog.FileName);

   end;
end;             


Перелопатил инет, простого и готового решения не нашел. Помогите мне пожалуйста.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Значит текст не utf16 , надо точно узнать в какой кодировке исходный текст
Попробуйте загрузить в Memo
bigbo
незнакомец
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

Сообщение bigbo »

Изображение

Если я переставляю галочку на что-либо другое - вижу кракозябры.
В ListBox добвляется всего пара десятков строк, хотя в файле их несколько сотен.
Думаю, проблема в ReadLn, но не уверен.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Еще может быть UTF32 , вообще лучше проверить с помощью enca
Попробуйте UTF8Encode
bigbo
незнакомец
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

Сообщение bigbo »

Открыл акелпадом, сохраняю-как...
Предлагает 1200 UTF-16 LE, галочка BOM стоит.

Для теста сохранил в UTF-8, закоментировал преобразование UTF16toUTF8 и все работает.
Но конвертировать файл нельзя, нужно использовать оригинальный формат.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

UTF8Encode тоже не работает ? Она переводит из UTF16 в UTF8
bigbo
незнакомец
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

Сообщение bigbo »

Не работает, проверил.
ReadLn точно способен прочесть конец строки в UTF-16?
eof способен найти конец файла правильно в таких файлах?

Создается очень мало строк и все они пустые, кроме первой. В первой только символы яю+ и все.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Странно, попробуйте грузить в Memo , а потом в ListBox
Memo.LoadFromFile
bigbo
незнакомец
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

Сообщение bigbo »

Код: Выделить всё

procedure TForm1.OpenFileClick(Sender: TObject);
var
 S: WideString;
begin
  If OpenDialog.Execute then
   begin
     AssignFile(file_input, OpenDialog.FileName);
     Reset(file_input);
     While not eof (file_input) do
     begin
       ReadLn(file_input, S);
       ListBox.Items.Add(UTF8Encode(S));
       Memo1.Lines.Add(UTF8Encode(S));
     end;
     CloseFile(file_input);
     //ListBox.Items.LoadFromFile(OpenDialog.FileName);

   end;
end;                               


Тот же результат и в Memo.

Изображение

Добавлено спустя 23 минуты 22 секунды:
И если загружать в мемо Memo.Lines.LoadfromFile то результат тот же почти, два знака вопроса с плюсом и все.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Надо Memo1.Lines.LoadFromFile
bigbo
незнакомец
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

Сообщение bigbo »

Ism писал(а):Надо Memo1.Lines.LoadFromFile


Сделал и так.

Только три символа добавляются, ??+
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Кажется надо удалить BOM перед загрузкой, это те самые 3 символа
bigbo
незнакомец
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

Сообщение bigbo »

Пересохранил без BOM, только символ плюса есть и все. Этот символ там действительно есть.
Использовал utf8encode - то же самое.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Значит проблема в кодировке, возможно надо не через readln а read

Добавлено спустя 19 минут 6 секунд:
А вообще readln работает только с 1 байтовой кодировкой
Возможно надо так http://www.cyberforum.ru/delphi-beginne ... 26613.html

Добавлено спустя 1 минуту 14 секунд:
http://www.delphisources.ru/pages/faq/b ... tream.html
bigbo
незнакомец
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

Сообщение bigbo »

Ууу... Темный лес. Знаю, что это не по правилам, но может кто покажет функцию готовую для чтения таких файлов? Или замену ReadLn и EoF?
Ответить