Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

преобразовать строку


Страницы:   1 2

Alexandr ©   (2006-02-22 13:02:00) 

подскажите, как преобразовать стоку HTML в которой вместо русских букв вот такое е
заменив в ней это на русский буквы.


Alexandr   (2006-02-23 06:52:00) [1]

а, ну да. знаю, что есть такие, и тож для численных кодов unicode не видел.
Видимо оно если и есть, как где-то автоматически в зависимостри от кодовой страницы указанной в хидере, а не как отдельная функция.


palva   (2006-02-23 00:27:00) [2]

В IdString.tpu есть функции для преобразования нескольких стандартных символов типа "

function  StrHtmlEncode (const AStr: String): String;
function  StrHtmlDecode (const AStr: String): String;

но преобразование численно заданных кодов что-то не видно.


palva   (2006-02-23 00:16:00) [3]

Пришло в голову, что подобная функция обязательно должна быть в Indi.


Alexandr   (2006-02-22 16:11:00) [4]

а... точно. ну да. на консоль то надо AnsiToOEM писать еще.


palva   (2006-02-22 15:43:00) [5]

palva ©   (22.02.06 15:14) [17]
> Ну да, неправильно преобразует.
На самом деле работает правильно. Это при выводе на консоль искажаются русские буквы.


Alexandr   (2006-02-22 15:25:00) [6]

ну тогда мой черновой вариант, сленпленный кое-как, но более-менее работающий.
Ногами не бить, в монитор не плевать.
Требует JclWideStrings.
Но идея проверена, показала работоспособность, теперь буду улучшать.


function ConvertUnicode(s:string):string;
var p:integer;
   r:string;
   c:string;
   pointer:integer;
begin
result:='';
repeat
 p:=pos('&#',s);
 pointer:=p;
 if p>0
  then begin
  c:=copy(s,p,7);
  try
   r:=WideCharToChar(WideChar(StrToInt(copy(c,3,4))));
   result:=result+copy(s,1,p-1)+r;
   delete(s,1,p+6);
  except
   result:=result+copy(s,1,p+1);
   delete(s,1,p+1);
  end;
  end;
until p=0;
end;


Alexandr   (2006-02-22 15:22:00) [7]

да, вообщем не все там так просто.
У меня ж на входе большой HTML поэтому парсер нужен достаточно мощний, чтоб он что попало не заменил. Вот те же больше-меньше. Или что в конце нет точки с запятой, и т.п.
Попробовал, как ты предложил. Получается в приницпе верно.
Осталось парсером очень четко выделять последовательность, которую надо преобразовывать.
Но это уже оставляю себе в качестве домашнего задания.

Хотя полная готовая функция преобразования не помешала бы. Но ее видимо надо искать где-то в компонентах которые работают в области html.
Насчет Java согласен. Там то оно есть. А вот тут мучаемся.


palva   (2006-02-22 15:14:00) [8]

Ну да, неправильно преобразует. Сейчас увидел, что должно быть слово 'ввод'


palva   (2006-02-22 15:11:00) [9]

Может быть такой код поможет. Может я и ошибся где-то. Во всяком случае ваша строка не преобразуется в осмысленное слово.

{$APPTYPE CONSOLE}
uses SysUtils;
var
 s: String;
function ddd(s: String): String;
var
 s1, buf: String;
 i, m: Integer;
 w: WideString;
 c: String[1];
begin
 SetLength(w, 1);
 s1:= '';
 m := 0;
 for i:= 1 to Length(s) do begin
   case m of
     0:
     begin
       if s[i] = '&' then begin
         m := 1;
         buf := '';
       end else begin
         s1 := s1 + s[i];
       end;
     end;
     1:
     begin
       if s[i] = '#' then begin
       end else if s[i] = ';' then begin
         w[1] := WideChar(StrToInt(buf));
         c := w;
         s1 := s1 + c;
         m := 0;
       end else begin
         buf := buf + s[i]
       end
     end
   end
 end;
 Result := s1;
end;
Begin
 s := 'ввод';
 WriteLn(ddd(s)); // ттюф
End.

Но здесь остались нерешенными вопросы преобразования других символов с амперсандами типа больше-меньше. В JavaScript подобными вопросами занимается стандартная функция, так что найти в сети исходник, наверно, можно. Может быть не на паскале.


Alexandr   (2006-02-22 14:37:00) [10]

о, это уже ближе к теме.
ща буду писать конвертер.
поиск готового результата не дал


palva   (2006-02-22 14:34:00) [11]

Число - это юникод. Надо перевести его из символьного вида в SmallInt. это и будет WideChar. Затем нужно перевести его в AnsiChar и получившимся символом заменить в строке всё что начинается амперсандом и кончается точкой с запятой включительно.

Если остались вопросы, задавайте.


Alexandr   (2006-02-22 14:29:00) [12]

так. строка нарисовалась корректно. Осталось теперь решить вопрос.


Alexandr   (2006-02-22 14:28:00) [13]

ввод


palva   (2006-02-22 14:25:00) [14]

Удалено модератором


palva   (2006-02-22 14:25:00) [15]

Получилось. Так что напишите здесь пример вашей строки и можно будет обсудить.


palva   (2006-02-22 14:24:00) [16]

Чтобы амперсанд показывался в HTML дословно можно отправлять его в виде: амперсанд-'amp'-точка_с_запятой. Вот сейчас попробую отправить:

&150;

Интересно, получится ли.


clickmaker   (2006-02-22 14:21:00) [17]


> Alexandr ©   (22.02.06 13:30) [7]

ежели у тебя текст в уникоде, то и работай с ним так
var S: WideString
S := текст из html;
AnsiStr := WideCharToString(PWideChar(S))


Alexandr   (2006-02-22 13:30:00) [18]

прошу прощения у модераторов форума за такое вынужденное тестирование ;)


Alexandr   (2006-02-22 13:28:00) [19]

упс. опять само передировало. Как же мне заслать сюда пример строки...
&п&о&з&и


Alexandr   (2006-02-22 13:27:00) [20]

пишу вот так
memo2.Text:=WideCharToString('позиции')
в memo2 тоже самое (входная строока)
пишу вот так
memo2.Text:=WideCharToString(PWideChar(memo1.text));
в memo2 куча вопросов.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо