Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

преобразовать строку   Найти похожие ветки 

 
Alexandr ©   (2006-02-22 13:02) [0]

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


 
Alexandr ©   (2006-02-22 13:06) [1]

вот же ш. даже форум перекодирует....
еще раз попробую.

&#1077

если не пройдет то вот так
&#<4 цифры>


 
clickmaker ©   (2006-02-22 13:11) [2]

это уникод
WideCharToString()


 
Alexandr ©   (2006-02-22 13:18) [3]

так оно примерно то да.
Но входной параметр у нее WideChar
а у меня строка в String
что-то не сходится...


 
clickmaker ©   (2006-02-22 13:22) [4]

WideCharToString(PWideChar(WS)


 
Alexandr ©   (2006-02-22 13:27) [5]

пишу вот так
memo2.Text:=WideCharToString("&#1087;&#1086;&#1079;&#1080;&#1094;&#1080;&#1080")
в memo2 тоже самое (входная строока)
пишу вот так
memo2.Text:=WideCharToString(PWideChar(memo1.text));
в memo2 куча вопросов.


 
Alexandr ©   (2006-02-22 13:28) [6]

упс. опять само передировало. Как же мне заслать сюда пример строки...
&&#1087;&&#1086;&&#1079;&&#1080;


 
Alexandr ©   (2006-02-22 13:30) [7]

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


 
clickmaker ©   (2006-02-22 14:21) [8]


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

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


 
palva ©   (2006-02-22 14:24) [9]

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

&amp;150;

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


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

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


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

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


 
Alexandr ©   (2006-02-22 14:28) [12]

&amp;#1074;&amp;#1074;&amp;#1086;&amp;#1076


 
Alexandr ©   (2006-02-22 14:29) [13]

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


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

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

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


 
Alexandr ©   (2006-02-22 14:37) [15]

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


 
palva ©   (2006-02-22 15:11) [16]

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

{$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 := "&#1074;&#1074;&#1086;&#1076;";
 WriteLn(ddd(s)); // ттюф
End.

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


 
palva ©   (2006-02-22 15:14) [17]

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


 
Alexandr ©   (2006-02-22 15:22) [18]

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

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


 
Alexandr ©   (2006-02-22 15:25) [19]

ну тогда мой черновой вариант, сленпленный кое-как, но более-менее работающий.
Ногами не бить, в монитор не плевать.
Требует 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;


 
palva ©   (2006-02-22 15:43) [20]

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


 
Alexandr ©   (2006-02-22 16:11) [21]

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


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

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


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

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

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

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


 
Alexandr ©   (2006-02-23 06:52) [24]

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.036 c
2-1142109472
ctudent
2006-03-11 23:37
2006.03.26
Как выполнить скрипт?


1-1140854033
аноним
2006-02-25 10:53
2006.03.26
Frame в run-time :)


15-1141191597
Ega23
2006-03-01 08:39
2006.03.26
Не високосный, но всё-таки: С Днём рождения! 29 февраля


15-1141471539
DenMaster
2006-03-04 14:25
2006.03.26
Помогите найти программу:


15-1140281080
Kerk
2006-02-18 19:44
2006.03.26
[firebird] Оптимизация запроса