C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Замена HTML символов., Ищу функцию
__Cheat3r
Отправлено: 20.03.2006, 19:00


Станционный диспетчер

Группа: Участник
Сообщений: 110



Собсна сабж.
Нужна функция, которая заменяет HTML символы
допустим

CODE

"&" на "&"
"»"на "»"


и так далее.
скорей нужна не функция, а таблица символов. но если кто то знает функцию — скиньте пожалуйста.
Спасибо.
__Cheat3r
Отправлено: 20.03.2006, 19:04


Станционный диспетчер

Группа: Участник
Сообщений: 110



Интересно. этот форум разпознаёт эти символы и через теги [Code] sad.gif
Grigoriy
Отправлено: 20.03.2006, 20:43


Мастер участка

Группа: Участник
Сообщений: 381



Значит Вам нужно заменить

&lt на <
&gt на>
&amp на &
&quot на "

или наоборот ?

А вот знаки такие

±

вам не нужны ? biggrin.gif biggrin.gif biggrin.gif
__Cheat3r
Отправлено: 20.03.2006, 20:57


Станционный диспетчер

Группа: Участник
Сообщений: 110



Да , я это и имею в виду smile.gif
__Cheat3r
Отправлено: 20.03.2006, 21:47


Станционный диспетчер

Группа: Участник
Сообщений: 110



Мне нужна вся абсолютно вся таблица символов:)
Grigoriy
Отправлено: 20.03.2006, 22:51


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE
Мне нужна вся абсолютно вся таблица символов:)


Вот так вот ?! biggrin.gif biggrin.gif biggrin.gif

Так любой же символ UNICODE в HTML — коде можно закодировать
так
&#Циферный код символа

Функция расположена в моем сообщении от 21/03/2006, 14:05.

Отредактировано Grigoriy — 21/03/2006, 14:12
__Cheat3r
Отправлено: 20.03.2006, 23:37


Станционный диспетчер

Группа: Участник
Сообщений: 110



а теперь представьте, сколько нужно силы воли , чтобы реализовать вот эту
таблицучерез функцию smile.gif)
Имхо, геморой biggrin.gif
я спрашивал, может существуют уже созданные для этго функции.

или можно по другму , переписать фукцию так: Берём TStringList
далее, проверяеть его строки по маске — к
од_символа|именной_код_символа|сам_символ| , где |- разделитель
а далее — замена. например так — amp|#38|&

Отредактировано __Cheat3r — 21/03/2006, 09:38
Grigoriy
Отправлено: 20.03.2006, 23:58


Мастер участка

Группа: Участник
Сообщений: 381



Ну и допустим код символа будет Ѕ.
Ну и как его записать в строку, где каждый символ кодируется одним байтом ?
Вы думали сначала над этим ?
Это должна быть "широкая строка".

Потому что число 1029 не поместится в один байт в двоичном виде а только в два.

А на входе какая строка ? Узкая ?
А на выходе — широкая ?

Так вот должно быть.



Отредактировано Grigoriy — 21/03/2006, 10:40
Grigoriy
Отправлено: 21.03.2006, 00:08


Мастер участка

Группа: Участник
Сообщений: 381



Насчет того что
QUOTE

а теперь представьте, сколько нужно силы воли , чтобы реализовать вот эту
таблицучерез функцию )
Имхо, геморой


Нет, это не тот геморой.
Геморой реализовать все 65535 символов в таблице Unicode...
А эта таблица http://project.net.ru/web-master/html/arti...icle1/116_5.htm
так это же просто 1/40 часть всей настоящей таблицы.

Отредактировано Grigoriy — 21/03/2006, 14:15
__Cheat3r
Отправлено: 21.03.2006, 00:17


Станционный диспетчер

Группа: Участник
Сообщений: 110



QUOTE (Grigoriy @ 21/03/2006, 10:08)
Нет, это не тот геморой.
Геморой реализовать все 65535 символов в таблице Unicode...
А эта таблица http://project.net.ru/web-master/html/arti...icle1/116_5.htm
так это же просто 1/40 часть всей настоящей таблицы.

да, много.
Не люблю Юникод:)
Раз столько много символов — тогда по-любому существуют уже готовые фукции для этого..
__Cheat3r
Отправлено: 21.03.2006, 00:26


Станционный диспетчер

Группа: Участник
Сообщений: 110



А вот и ответ на вопрос :
httpapp.hpp

extern PACKAGE AnsiString __fastcall HTMLEncode(const AnsiString AStr);
extern PACKAGE AnsiString __fastcall HTMLDecode(const AnsiString AStr);
Grigoriy
Отправлено: 21.03.2006, 00:34


Мастер участка

Группа: Участник
Сообщений: 381



Ну я хочу выяснить вот что.
Вы хотите получить широкую строку, где были бы заменены закодированные символы их двухбайтными эквивалентами ?

Ведь кодирование символа амперсант-диезом для того и предназначено, чтобы экономить место занимаемое строкой, потому что если почти все символы в этой строке могут быть закодированы одним байтом, то незачем тогда тратить на каждый символ ещё один лишний байт. Я правильно понял?
Но если же в вашей строке встретится символ из таблицы Unicode, то преобразовать этот символ так чтобы остальные кодировались одним байтом а этот двумя я не знаю как.

Собственно, я так и не понял, чего вы добиваетесь ?
Вы хотите преобразовывать все "амперсанты" в реальные символы или наоборот расширенные символы в их амперсантные коды ?
Или просто хотите, чтобы эта строка могла выводиться на экран ?

Ответьте мне на эти вопросы и тогда будем работать дальше. ОК ?
__Cheat3r
Отправлено: 21.03.2006, 00:45


Станционный диспетчер

Группа: Участник
Сообщений: 110



Вопщем , я гружу HTML страницу, где присутствует этот Unicode.
и просто вывожу данные этой страницы на экран  — т.е. мне нужно декодировать все спец. символы с HTML-кода. и показать пользователь в "красивом виде"


З.Ы. функции, приведённые с httpapp/hpp -глючат.

Отредактировано __Cheat3r — 21/03/2006, 10:46
Grigoriy
Отправлено: 21.03.2006, 00:48


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (__Cheat3r @ 21/03/2006, 00:26)
А вот и ответ на вопрос :
httpapp.hpp

extern PACKAGE AnsiString __fastcall HTMLEncode(const AnsiString AStr);
extern PACKAGE AnsiString __fastcall HTMLDecode(const AnsiString AStr);

Ну ладно, пробуйте HTMLDecode.

Только я почему то при декодировании строки
CODE

&#1055


не получил символ

П

Отредактировано Grigoriy — 21/03/2006, 00:49
__Cheat3r
Отправлено: 21.03.2006, 01:02


Станционный диспетчер

Группа: Участник
Сообщений: 110



функции, приведённые с httpapp.hpp -глючат.

Отредактировано __Cheat3r — 21/03/2006, 11:04
Grigoriy
Отправлено: 21.03.2006, 01:56


Мастер участка

Группа: Участник
Сообщений: 381



Вы будете греческие символы выводить ?
Я вообще запутался в этих кодировках.

Функции канвы для вывода текста работают со строками типа AnsiString, а не WideString.

Если нужно набор символов по умолчанию, то можно составить код.
Но сейчас уже позно. Спать надо.
__Cheat3r
Отправлено: 21.03.2006, 02:06


Станционный диспетчер

Группа: Участник
Сообщений: 110



Нет, греческие не буду %)))
только те , которые по умолчанию smile.gif
Grigoriy
Отправлено: 21.03.2006, 08:33


Мастер участка

Группа: Участник
Сообщений: 381



Интересно. Есть в Windows функция которая выводит широкие строки на поверхность устройства ?
Grigoriy
Отправлено: 21.03.2006, 14:05


Мастер участка

Группа: Участник
Сообщений: 381



Составлял функцию с 8 часов утра.

Работает на мой взгляд безупречно.
Как всегда на моем любимом ассемблере, который лишает процессор нужды каждый раз проходить по одним и тем же символам с самого начала строки при обработке очередной подстроки.

Кстати, таблица Вам, __Cheat3r не нужна уже. biggrin.gif biggrin.gif biggrin.gif
И знаете почему ? Потому что функция понимает любой символ Unicode.
Ведь его код записан в строчке. И просто нужно преобразовать последовательность символов целого числа в двухбайтное челое число в двоичном виде — это и есть тот искомый символ. Ничего геморройного тут нет...

Функция на первый взгляд довольно большая, но выполняться она будет быстро !

CODE

WideString NormalizationString_type2(AnsiString SourseStr, AnsiString &DestStr)
{
void* p;
void* pl;
unsigned int L,L1,esi1,ls;
WideString Wstr;
L=SourseStr.Length();
Wstr=SourseStr;
Wstr.SetLength(L+8);
Wstr[L+1]='\0';
Wstr[L+2]='\0';
p=Wstr.c_bstr();
L=Wstr.Length();
DestStr.SetLength(L);
if (!L) return DestStr;
//или просто return; , если измените результат функции на void
asm
{
xor ecx,ecx;
mov esi,p;
mov edi,p;
//-----------------------------------------------
cld;
@c1:lodsw;
cmp ax,0;
jz @en;
cmp ax,38;//&
jne @1;
mov edx,[esi];
cmp dx,35;//#
je @diez;
cmp edx,0x0074006c;//lt
jne @2;
mov dx,[esi+4];//начало так называемого "припев" -а
cmp dx,48;
jb @lt;
cmp dx,57;
jbe @1;
cmp dx,64;
jbe @lt;
cmp dx,90;
jbe @1;
cmp dx,97;
jb @lt;
cmp dx,122;
jbe @1;
cmp dx,1040;
jae @1;
@lt://конец так называемого "припев" -а
mov ax,60;
stosw;
add esi,6;
inc ecx;
jmp @c1;
@2:cmp edx,0x00740067;//tg
jne @3;
mov dx,[esi+4];//начало так называемого "припев" -а
cmp dx,48;
jb @gt;
cmp dx,57;
jbe @1;
cmp dx,64;
jbe @gt;
cmp dx,90;
jbe @1;
cmp dx,97;
jb @gt;
cmp dx,122;
jbe @1;
cmp dx,1040;
jae @1;
@gt://конец так называемого "припев" -а
mov ax,62;
stosw;
add esi,6;
inc ecx;
jmp @c1;
@3:
cmp edx,0x006d0061;//am
jne @4;
cmp word ptr [esi+4],0x0070;//p
jne @1;
mov dx,[esi+6];//начало так называемого "припев" -а
cmp dx,48;
jb @amp;
cmp dx,57;
jbe @1;
cmp dx,64;
jbe @amp;
cmp dx,90;
jbe @1;
cmp dx,97;
jb @amp;
cmp dx,122;
jbe @1;
cmp dx,1040;
jae @1;
@amp://конец так называемого "припев" -а
mov ax,38;
stosw;
add esi,8;
inc ecx;
jmp @c1;
@4:
cmp edx,0x00750071;//qu
jne @1;
cmp dword ptr [esi+4],0x0074006f;//ot
jne @1;
mov dx,[esi+8];//начало так называемого "припев" -а
cmp dx,48;
jb @quot;
cmp dx,57;
jbe @1;
cmp dx,64;
jbe @quot;
cmp dx,90;
jbe @1;
cmp dx,97;
jb @quot;
cmp dx,122;
jbe @1;
cmp dx,1040;
jae @1;
@quot://конец так называемого "припев" -а
mov ax,34;
stosw;
add esi,10;
inc ecx;
jmp @c1;
@diez: //В СЛУЧАЕ КОДИРОВАНИЯ ЛЮБОГО СИМВОЛА ИЗ ТАБЛИЦЫ UNICODE
cmp byte ptr [esi+2],'0';
jb @1;
cmp byte ptr [esi+2],'9';
ja @1;
mov eax,0;
mov bl,10;
add esi,2;
@c2:
mov dx,[esi];
sub dx,48;
cmp dx,9;
ja @6;
mul bl;
add ax,dx;
add esi,2;
jmp @c2;
@6:
stosw;
inc ecx;
jmp @c1;
@1:stosw;
inc ecx;
jmp @c1;
@en:mov L1,ecx;
};
Wstr.SetLength(L1);
DestStr=Wstr;
return Wstr;
//или просто return; , если измените результат функции на void
};


DestStr — параметр со ссылкой — это простая Ansi — строка.
А возвращает в return функция широкую строку.
Если хотите какой-то из параметров или результат функции изменить — экспериментируйте. Всего наилучшего ! smile.gif

Отредактировано Grigoriy — 21/03/2006, 14:18
__Cheat3r
Отправлено: 21.03.2006, 17:55


Станционный диспетчер

Группа: Участник
Сообщений: 110



Как всегда, Спасибо Григорий smile.gif
Раньше пытался чтото сделать с WideString, но , все попытки были без успешны. Буду тестить smile.gif

Отредактировано __Cheat3r — 22/03/2006, 03:56

Вернуться в Вопросы программирования в C++Builder