Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2012, 00:06   #1
s500
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 10
По умолчанию определение кодировки текстового файла+вопрос

Доброго времени суток!
Мне нужно определить исходную кодировку текстового файла (.txt) и вывести имя кодировки!!!, а потом сохранить этот файл в другой кодировке.
Возникли проблемы при определении кодировки.
Я не знаю где мне посмотреть имя исходной кодировки, хотя такой метод существует (TEncoding.GetEncodingName), но и с ним возникли вопросы.

Ругается что нету такого:

рис.1

Хотя в описании класса присутствует:

рис.2

Судя из описания метода, ничего я не получу.:
Код:
function TEncoding.GetEncodingName: string;
begin
  Result := '';
end;
Прошу помочь мне определить имя кодировки.
Код моей программы:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
  LBuffer: TBytes;
  LByteOrderMark: TBytes;
  LOffset: Integer;
  LEncoding, DestEncoding: TEncoding;
  LFileStream: TFileStream;
  EncodingArray: array[0..5] of TEncoding;
begin
  LEncoding:=nil;
  EncodingArray[0]:= TEncoding.UTF8;
  EncodingArray[1]:= TEncoding.UTF7;
  EncodingArray[2]:= TEncoding.Unicode;
  EncodingArray[3]:= TEncoding.Default;
  EncodingArray[4]:= TEncoding.BigEndianUnicode;
  EncodingArray[5]:= TEncoding.ASCII;
  OpenDialog1.Filter:='Текстовый файлы|*.txt';
  OpenDialog1.InitialDir:='D:\';
  if OpenDialog1.Execute and FIleExists(OpenDialog1.FileName) then
  LFileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
  SetLength(LBuffer, LFileStream.Size);
  LFileStream.ReadBuffer(Pointer(LBuffer)^, Length(LBuffer));
  LOffset := TEncoding.GetBufferEncoding(LBuffer, LEncoding);
  lol:=TEncoding.GetEncoding(LOffset);
  s:=LEncoding.GetEncodingName;
  LByteOrderMark := LEncoding.GetPreamble;
end;
s500 вне форума Ответить с цитированием
Старый 10.04.2012, 05:45   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

только анализируя количество букв русского алфавита и сравнивая с обычным для языка статистическим распределением
Вложения
Тип файла: zip CharsetAnalis.zip (1.8 Кб, 70 просмотров)
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 10.04.2012, 07:50   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

GetEncodingName это strict protected член класса, до него из клиентского кода не добраться. То что он возвращает пустую строку при виртуальности функции значит что скорее всего его потомки (класса TEncoding) будут возвращать нужное имя (плюс , возможно перенесут метод в public секцию).

Я бы посоветовал обратиться к документации по данному классу, или использовать другие методы
phomm вне форума Ответить с цитированием
Старый 10.04.2012, 14:31   #4
s500
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
только анализируя количество букв русского алфавита и сравнивая с обычным для языка статистическим распределением
а как этим пользоваться?
s500 вне форума Ответить с цитированием
Старый 10.04.2012, 16:14   #5
s500
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
GetEncodingName это strict protected член класса, до него из клиентского кода не добраться. То что он возвращает пустую строку при виртуальности функции значит что скорее всего его потомки (класса TEncoding) будут возвращать нужное имя (плюс , возможно перенесут метод в public секцию).

Я бы посоветовал обратиться к документации по данному классу, или использовать другие методы
а можете подсказать какие именно?
s500 вне форума Ответить с цитированием
Старый 10.04.2012, 19:12   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от s500 Посмотреть сообщение
а как этим пользоваться?
Код:
var
s:string;
CharSet:TCharSet;
begin
s:='оПЮБХКЮ ПЮГДЕКЮ. вХРЮРЭ БЯЕЛ! нЯНАЕММН НГЮАНВЕММШЛ ЯРСДЕМРЮЛ';
CharSet:=StrCharSet(s);
s:=StrCharSetConver(s,CharSet,csWin);
Caption:=s;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 10.04.2012, 20:45   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Достоверно определить кодировку текстового файла принципиально невозможно, т.к. такой информации ни в самом файле, ни в файловой системе нет.
Метод, очевидно, сделан как заглушка для будущих разработок. Если есть желание, можно написать его самому, но см. выше.
Для определения кодировки следует использовать несколько формальных признаков и статистические методы.
s-andriano вне форума Ответить с цитированием
Старый 10.04.2012, 20:59   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

однозначно определить можно только кодировки с BOM(а файлы не обязаны содержать этот BOM), а это семейство UTF.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение кодировки текстового файла Sobaka_ru Помощь студентам 3 23.01.2012 09:41
Изменение кодировки файла. goodwen C# (си шарп) 4 15.12.2011 19:12
Различные кодировки- считывание из файла. NikLik Общие вопросы Delphi 2 15.09.2008 23:12
Очень БОЛЬШОЙ вопрос про кодировки в базе Tanuska___:) БД в Delphi 3 02.05.2008 05:36