Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Внизпреобразовать строку Найти похожие ветки
← →
Alexandr © (2006-02-22 13:02) [0]подскажите, как преобразовать стоку HTML в которой вместо русских букв вот такое е
заменив в ней это на русский буквы.
← →
Alexandr © (2006-02-22 13:06) [1]вот же ш. даже форум перекодирует....
еще раз попробую.
е
если не пройдет то вот так
&#<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("позиции")
в memo2 тоже самое (входная строока)
пишу вот так
memo2.Text:=WideCharToString(PWideChar(memo1.text));
в memo2 куча вопросов.
← →
Alexandr © (2006-02-22 13:28) [6]упс. опять само передировало. Как же мне заслать сюда пример строки...
&п&о&з&и
← →
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"-точка_с_запятой. Вот сейчас попробую отправить:
&150;
Интересно, получится ли.
← →
palva © (2006-02-22 14:25) [10]Получилось. Так что напишите здесь пример вашей строки и можно будет обсудить.
← →
palva © (2006-02-22 14:25) [11]Удалено модератором
← →
Alexandr © (2006-02-22 14:28) [12]&#1074;&#1074;&#1086;&#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 := "ввод";
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 есть функции для преобразования нескольких стандартных символов типа &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