Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите прочитать Unicode файл... 
:(
    Опции темы
BDmV
  Дата 15.5.2005, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 14.5.2005

Репутация: нет
Всего: 1



Поможите, плиззз, дайте код для чтения Unicode файла.... smile

Вобщем есть файл писаный в Unicode кодировке, я хочу загрузить его в SynEdit...

1. Стандартные загрузчик SynEdit.Lines.LoadFromFile ничего хорошего не даёт smile
2. При попытке читать файл с помощью Readln(f,s) а потом строку s приобразовывать в ANSI, тоже ничего хорошего не даёт т.к. зачастую в любом, заранее не известном, месте файла встречается что-то что востпринимается как конец файла smile
3. Читать файл через BlockRead - очень медленно.. smile

PS. К сожалению др. методов работы с файлами я не знаю...


ЗЗЫ. Видел на форуме код http://forum.vingrad.ru/index.php?showtopi...indpost&p=50099 - но он тоже читает не весь файл и вместо русских букв выдаёт '?' smile

PM MAIL   Вверх
Петрович
Дата 16.5.2005, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(BDmV @ 15.5.2005, 16:04)
3. Читать файл через BlockRead - очень медленно..

Это наверное если читать побайтово. А если большими блоками, то это достаточно быстро.

А вообще, можешь попробовать что-то вроде:

Код

function FileToWideStr (FileName :String) :WideString;
  // Возвращает содержимое файла FileName как строку
var
  h :THandle;
  FileSize, rFileSize :Cardinal;
begin
  try
    h := FileOpen(FileName,(fmOpenRead+fmShareDenyNone));
    try
      CheckOSError(h<>INVALID_HANDLE_VALUE,sErrorFileOpen,[q(FileName)]);
      FileSize := GetFileSize(h,nil);
      CheckOSError(FileSize<>$FFFFFFFF);
      SetLength(Result,FileSize div 2);
      CheckOSError(ReadFile(h,Result[1],FileSize,rFileSize,nil));
      if  rFileSize <> FileSize  then
        raise EOSError.CreateFmt(sErrorFileRead,[FileSize,rFileSize]);
    finally
      FileClose(h);
    end;
  except
    ExMsg(sErrorFileToStr,[qd(FileName)]);
    raise;
  end;
end;


Соответственно, далее делаешь что-то вроде:

Код

var
  s :String;
...
  s := FileToWideStr('вася');

и получаешь в s содержимое файла в ANSI-кодировке.

Правда, в некоторых UNICODE-файлах, первые два байта не являются текстом, а признаком порядка байт.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
BDmV
Дата 16.5.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 14.5.2005

Репутация: нет
Всего: 1



Спасибо за код, но у мя появился вопрос... В какой библиотеке, в Delphi7, искать CheckOSError и sErrorFileOpen? smile
PM MAIL   Вверх
Quadr0
Дата 16.5.2005, 18:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:31
  Вверх
Quadr0
Дата 16.5.2005, 18:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:31
  Вверх
Петрович
Дата 16.5.2005, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(BDmV @ 16.5.2005, 19:01)
CheckOSError и sErrorFileOpen

Таких нет, это из моей библиотеки. Но их суть такова:
CheckOSError - нужна для проверки на ошибки;
sErrorFileOpen - константа, строки с сообщением об ошибке;
ExMsg - добавляет сообщение к тексту текущего исключения;

В общем, не сложно самому сделать smile.
Но, если лениво, то можешь найти их в моем модуле awString.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
BDmV
Дата 18.5.2005, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 14.5.2005

Репутация: нет
Всего: 1



Цитата(Quadr0 @ 16.5.2005, 18:26)
Уже вышла версия SynEdit специально для работы с ЮНИКОДОМ:


Вот спасиба smile

smile Жаль только, что он воспринимает файлы, как Unicode, только если он начинается с FFFE. Во всех остальных случаях гонит его как простой Ansi. smile

Да и не подходит он к моей задаче, т.к. там конец абзаца заканчивается кодом 0D0A00, вместо 0D000A00 smile

Вощем здесь можно только читать файл самому и обрабатывать полученный текст перед тем как загнать его в SynEdit...

PS. Хотя мож есть и др. вариант, но я об этом пока не знаю.. smile
PM MAIL   Вверх
Guest
Дата 19.5.2005, 09:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(BDmV @ 18.5.2005, 19:32)
Жаль только, что он воспринимает файлы, как Unicode, только если он начинается с FFFE.

ну вобщем то так и должно быть. Если файл начинается с других байтов, то это не Unicode - text file
Цитата(BDmV @ 18.5.2005, 19:32)
т.к. там конец абзаца заканчивается кодом 0D0A00,

ну так считывай вручную. Никакие стандартные средства тебе не помогут - у тебя же не текстовый файл..
  Вверх
Medved
Дата 21.5.2005, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Спасибо Петрович, я в свой модуль uutils, обязательно добавлю эту функцию. Лаконичная реализация.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.