Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.03.2013, 14:50
Pcrepair
 
Сообщения: n/a
По умолчанию Оператор IF. Выбор кодировки ХТМЛ-страницы

Добрый день. Есть функция выбора кодовой страницы

Код:
function FindCharSet(const Data:string):integer;
const (*это в общем не нужно*)
  CodePages: array[0..10] of string = ('utf-8','utf-16','windows-1251','koi8-r','iso-8859-1',
  'iso-8859-15','windows-1252','iso-8859-2','iso-8859-3','iso-8859-4','iso-8859-5');

var Pos1,Pos2:integer; CharSet:string;
begin
  Pos1:=PosEx('charset=',Data,1);   
  Pos2:=PosEx('>',Data,Pos1);
  CharSet:=Copy(Data, Pos1,(Pos2-Pos1+1)); (*выделяем чарсет из страницы*)
  if Pos1 > 0 then (*если чарсет есть тогда*)
  begin
    if True then (*если в чарсет нет указания на кодировку страницы, принудительно назначить 1251*)
      begin
        Result:=1251;
      end
      else  (*когда номер страницы указан*)
      begin
        if PosEx('utf-8',CharSet,1) > 0 then         Result:=65001;
        if PosEx('utf-16',CharSet,1) > 0 then        Result:=65001;
        if PosEx('windows-1251',CharSet,1) > 0 then  Result:=1251;
        if PosEx('windows-1252',CharSet,1) > 0 then  Result:=1252;
        if PosEx('koi8-r',CharSet,1) > 0 then        Result:=20866;
        if PosEx('iso-8859-1',CharSet,1) > 0 then    Result:=28591;
        if PosEx('iso-8859-2',CharSet,1) > 0 then    Result:=28592;
        if PosEx('iso-8859-3',CharSet,1) > 0 then    Result:=28593;
        if PosEx('iso-8859-4',CharSet,1) > 0 then    Result:=28594;
        if PosEx('iso-8859-5',CharSet,1) > 0 then    Result:=28595;
        if PosEx('iso-8859-15',CharSet,1) > 0 then   Result:=28605;
      end;
  end
  else (когда чарсета нет, присваиваем принудительно)
  begin
    Result:=1251;
  end;
end;

Внимание!! Вопрос: Как покороче написать if True then
если использовать массив строк, то прийдется лепить излишне сложный код, поскольку есть варианты:
charset=windows-1251"
charset="windows-1251"
charset='windows-1251' из этого нужно выделить windows-1251(к примеру)
если помножить на число кодировок получается громоздко. нет ли какого фокуса чтоб написать покороче
Ответить с цитированием
  #2  
Старый 11.03.2013, 14:57
qeos qeos вне форума
Прохожий
 
Регистрация: 11.03.2013
Сообщения: 4
Репутация: 10
Радость

regexp? )))
Ответить с цитированием
  #3  
Старый 11.03.2013, 15:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

завести 2 массива charset[]: String и codepage[]: Integer и через
Код:
function AnsiIndexText(const AText: string; const AValues: array of string): Integer;
получать индекс charset и по этому индексу из массива codepage[]: Integer получить codepage.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 11.03.2013, 15:12
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ассоциативный контейнер.
Код:
codepage := list.indexof(переменная с текстом кодировки);
if codepage = -1 then
  showmessage('неизвестная кодировка');

Цитата:
Сообщение от NumLock
завести 2 массива charset[]: String и codepage[]: Integer

можно один TStrings к примеру.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 11.03.2013, 15:20
Pcrepair
 
Сообщения: n/a
По умолчанию

это все хорошо, особенно про AnsiIndexText. все это уже используется

но чтоб это применить нужно точно выявить строку с указание кодировки, к примеру windows-1251, что не так то просто с учетом вариантов
charset=windows-1251"
charset="windows-1251"
charset='windows-1251'
как сделать простым код выделения указания кодировки, вот о чем вопрос
Ответить с цитированием
  #6  
Старый 11.03.2013, 15:25
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Pcrepair
не так то просто с учетом вариантов
это очень просто:
Код:
  Caption:=StringReplace(Caption, '''', '', [rfReplaceAll, rfIgnoreCase]);
  Caption:=StringReplace(Caption, '"', '', [rfReplaceAll, rfIgnoreCase]);
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 11.03.2013, 15:40
Pcrepair
 
Сообщения: n/a
По умолчанию

немного сложнее, на самом деле
charset=windows-1251"
charset="windows-1251"
charset='windows-1251'
или вообще
charset=koi8-r" http-equiv="content-type" />
или еще длиннее

может запустить цикл FOR с PosEX внутри и подстановкой в цикле значения кодировки из массива? если есть хоть одно совпадение, тогда ДА, если ни одного тогда НЕТ(это выход функции)???
или есть что по прямее, что то чего Я пока еще не знаю?
Ответить с цитированием
  #8  
Старый 11.03.2013, 15:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

проще сразу искать одинарную кавычку или двойную в найденной строке charset=... и делать обрезание по этой позиции.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 12.03.2013, 06:14
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Код:
function FindCharSet(const Data:string):integer;
const
  CodePages: array[0..10] of string = ('windows-1251','utf-8','utf-16','windows-1252',
  'koi8-r','iso-8859-1','iso-8859-2','iso-8859-3','iso-8859-4','iso-8859-5','iso-8859-15');
  ResArray: array[0..10] of Word = (1251,65001,65001,1252,20866,28591,28592,28593,
  28594,28595,28605);

var APos:integer; CharSet:string;
begin
  Result:=Pos('charset=',Data);   
  APos:=PosEx('>',Data,Result);
  CharSet:=Copy(Data, Result,(APos-Result+1));
  if Result > 0 then
    for Result := Length(CodePages)-1 downto 0 do
      if Pos(CodePages[Result],CharSet) > 0 then
        Break;
  Result := ResArray[Result];
end;
Короче пока не получилось...
Ответить с цитированием
Этот пользователь сказал Спасибо BBBCat за это полезное сообщение:
Pcrepair (12.03.2013)
  #10  
Старый 12.03.2013, 10:01
Pcrepair
 
Сообщения: n/a
По умолчанию

только один вопрос:
использование result в качестве переменной по ходу выполнения функции это точно правильно? или может лучше назначить переменные а result использовать только в конце, в момент присвоения результата?
Ответить с цитированием
  #11  
Старый 12.03.2013, 10:08
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Ну дык надо было сократить, вот я и постарался Возможно использование Result - это моветон, но неприятностей это не принесёт. Да и вообще-то компилятор Delphi вечно лается, что у вас объявлена переменная, но она нигде не используется, а у самих Result почти не используется
Ответить с цитированием
  #12  
Старый 12.03.2013, 12:02
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Сорри, обнаружил баг - цикл нужно сделать не до 0, а до 1. Ну и выкинул кое-что...
Код:
function FindCharSet(const Data:string):integer;
const
  CodePages: array[0..10] of string = ('windows-1251','utf-8','utf-16','windows-1252',
  'koi8-r','iso-8859-1','iso-8859-2','iso-8859-3','iso-8859-4','iso-8859-5','iso-8859-15');
  ResArray: array[0..10] of Word = (1251,65001,65001,1252,20866,28591,28592,28593,
  28594,28595,28605);

var CharSet:string;
begin
  Result:=Pos('charset=',Data);   
  CharSet:=Copy(Data, Result,(PosEx('>',Data,Result)-Result));
  if Result > 0 then
    for Result := Length(CodePages)-1 downto 1 do
      if Pos(CodePages[Result],CharSet) > 0 then
        Break;
  Result := ResArray[Result];
end;
Ответить с цитированием
Этот пользователь сказал Спасибо BBBCat за это полезное сообщение:
Pcrepair (12.03.2013)
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:08.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025