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

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

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

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

Сообщение bigbo » 27.05.2012 21:30:18

Не могу прочитать нормально текстовый файл.
Оказалось, что файл имеет 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;             


Перелопатил инет, простого и готового решения не нашел. Помогите мне пожалуйста.
bigbo
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

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

Сообщение Ism » 27.05.2012 21:53:00

Значит текст не utf16 , надо точно узнать в какой кодировке исходный текст
Попробуйте загрузить в Memo
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение bigbo » 27.05.2012 22:02:36

Изображение

Если я переставляю галочку на что-либо другое - вижу кракозябры.
В ListBox добвляется всего пара десятков строк, хотя в файле их несколько сотен.
Думаю, проблема в ReadLn, но не уверен.
bigbo
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

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

Сообщение Ism » 27.05.2012 22:12:32

Еще может быть UTF32 , вообще лучше проверить с помощью enca
Попробуйте UTF8Encode
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение bigbo » 27.05.2012 22:18:19

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

Для теста сохранил в UTF-8, закоментировал преобразование UTF16toUTF8 и все работает.
Но конвертировать файл нельзя, нужно использовать оригинальный формат.
bigbo
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

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

Сообщение Ism » 27.05.2012 22:31:06

UTF8Encode тоже не работает ? Она переводит из UTF16 в UTF8
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение bigbo » 27.05.2012 22:37:13

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

Создается очень мало строк и все они пустые, кроме первой. В первой только символы яю+ и все.
bigbo
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

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

Сообщение Ism » 27.05.2012 23:01:51

Странно, попробуйте грузить в Memo , а потом в ListBox
Memo.LoadFromFile
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение bigbo » 27.05.2012 23:10:02

Код: Выделить всё
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 то результат тот же почти, два знака вопроса с плюсом и все.
bigbo
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

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

Сообщение Ism » 27.05.2012 23:34:10

Надо Memo1.Lines.LoadFromFile
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение bigbo » 27.05.2012 23:37:05

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


Сделал и так.

Только три символа добавляются, ??+
bigbo
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

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

Сообщение Ism » 27.05.2012 23:37:20

Кажется надо удалить BOM перед загрузкой, это те самые 3 символа
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение bigbo » 27.05.2012 23:51:36

Пересохранил без BOM, только символ плюса есть и все. Этот символ там действительно есть.
Использовал utf8encode - то же самое.
bigbo
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

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

Сообщение Ism » 28.05.2012 00:04:13

Значит проблема в кодировке, возможно надо не через 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
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение bigbo » 28.05.2012 00:44:46

Ууу... Темный лес. Знаю, что это не по правилам, но может кто покажет функцию готовую для чтения таких файлов? Или замену ReadLn и EoF?
bigbo
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.05.2012 21:13:04

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 1

Рейтинг@Mail.ru