__Cheat3r |
Отправлено: 20.03.2006, 19:00 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 110
|
Собсна сабж.
Нужна функция, которая заменяет HTML символы
допустим
CODE |
"&" на "&"
"»"на "»"
|
и так далее.
скорей нужна не функция, а таблица символов. но если кто то знает функцию — скиньте пожалуйста.
Спасибо. |
|
__Cheat3r |
Отправлено: 20.03.2006, 19:04 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 110
|
Интересно. этот форум разпознаёт эти символы и через теги [Code] |
|
Grigoriy |
Отправлено: 20.03.2006, 20:43 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Значит Вам нужно заменить
< на <
> на>
& на &
" на "
или наоборот ?
А вот знаки такие
±
вам не нужны ?
|
|
__Cheat3r |
Отправлено: 20.03.2006, 20:57 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 110
|
Да , я это и имею в виду |
|
__Cheat3r |
Отправлено: 20.03.2006, 21:47 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 110
|
Мне нужна вся абсолютно вся таблица символов:) |
|
Grigoriy |
Отправлено: 20.03.2006, 22:51 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE | Мне нужна вся абсолютно вся таблица символов:) |
Вот так вот ?!
Так любой же символ UNICODE в HTML — коде можно закодировать
так
Циферный код символа
Функция расположена в моем сообщении от 21/03/2006, 14:05.
Отредактировано Grigoriy — 21/03/2006, 14:12
|
|
__Cheat3r |
Отправлено: 20.03.2006, 23:37 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 110
|
а теперь представьте, сколько нужно силы воли , чтобы реализовать вот эту
таблицучерез функцию )
Имхо, геморой
я спрашивал, может существуют уже созданные для этго функции.
или можно по другму , переписать фукцию так: Берём 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
|
да, много.
Не люблю Юникод:)
Раз столько много символов — тогда по-любому существуют уже готовые фукции для этого.. |
|
__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.
Только я почему то при декодировании строки
не получил символ
П
Отредактировано 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
|
Нет, греческие не буду %)))
только те , которые по умолчанию |
|
Grigoriy |
Отправлено: 21.03.2006, 08:33 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Интересно. Есть в Windows функция которая выводит широкие строки на поверхность устройства ?
|
|
Grigoriy |
Отправлено: 21.03.2006, 14:05 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Составлял функцию с 8 часов утра.
Работает на мой взгляд безупречно.
Как всегда на моем любимом ассемблере, который лишает процессор нужды каждый раз проходить по одним и тем же символам с самого начала строки при обработке очередной подстроки.
Кстати, таблица Вам, __Cheat3r не нужна уже.
И знаете почему ? Потому что функция понимает любой символ 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 функция широкую строку.
Если хотите какой-то из параметров или результат функции изменить — экспериментируйте. Всего наилучшего !
Отредактировано Grigoriy — 21/03/2006, 14:18
|
|
__Cheat3r |
Отправлено: 21.03.2006, 17:55 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 110
|
Как всегда, Спасибо Григорий
Раньше пытался чтото сделать с WideString, но , все попытки были без успешны. Буду тестить
Отредактировано __Cheat3r — 22/03/2006, 03:56 |
|