![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
преобразовать строку
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 куча вопросов.