Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.041 c
2-1141716984
Ivolg
2006-03-07 10:36
2006.03.26
Чтение из потока...


11-1123144916
jumpingjack
2005-08-04 12:41
2006.03.26
Запись/чтение текущего времени в файл


15-1141520170
постигаю
2006-03-05 03:56
2006.03.26
загрузка во фреймы


2-1142245192
dabreezy
2006-03-13 13:19
2006.03.26
TstringList - глюк на глюке.


1-1140430048
MegaVolt
2006-02-20 13:07
2006.03.26
Как испольовать Dunit для privat секции?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский