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

 
Из кракозябликов — в русские буквы, Internet Explorer
Admin
Отправлено: 15.07.2005, 11:09


Владимир

Группа: Администратор
Сообщений: 1190



Есть строка AnsiString c названием файла на русском языке, переведенная как переводит(передает) Internet Exlorer русские буквы
в параметрах типа:

CODE

AnsiString s = "%d0%bd%d0%b0%d1%81%d1%82_52-43.txt";


Как эту строку перевести на русский язык в C++Builder ?
AVC
Отправлено: 15.07.2005, 11:48


Ветеран

Группа: Модератор
Сообщений: 1583



Давно было дело.
CODE

PACKAGE AnsiString __fastcall WWWDeCode (const AnsiString& inp) // Раскодировать
{
const char hex [] = "0123456789ABCDEF";

AnsiString text = "";
AnsiString str;
char  *in = inp.c_str();
char   ch, cl;

for (char c = *in; c; in++, c = *in)
{ if  (c == '+') { text += " ";    continue; }
else if (c != '%') { text += AnsiString(c);  continue; }

in++; ch = *in; if (!ch) break;
if (ch == '%')  { text += AnsiString(ch);  continue; }

in++; cl = *in; if (!cl) break;

c = 0x00;
for (int i=0; hex[i]; i++)
 if (hex[i] == ch) { c = (i << 4) & 0xF0; break; }

for (int i=0; hex[i]; i++)
 if (hex[i] == cl) { c |= (i & 0x0F);  break; }


if (c) text += AnsiString(c);
}

return text;
}


Извиняюсь, что код не оптимальный. Когда был нужен, нужно было быстро. А потом руки не дошли.
Guest
Отправлено: 15.07.2005, 14:57


Не зарегистрирован







Увы чего-то наверное не хватает -

CODE

    AnsiString s = "%d0%bd%d0%b0%d1%81%d1%82_52-43.txt";
    ShowMessage( WWWDeCode(s) );


Получаем белиберду, русского текста так и нет.
esh
Отправлено: 15.07.2005, 16:30


Дежурный стрелочник

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



так она же в юникоде, а hex значения с маленькими буквами.

Вот эта (слегка переделал) должна и с маленькими буквами работать (не проверял), правда поддержки юникода нет.

CODE
AnsiString WWWDeCode (const AnsiString inp)
{
const char hex [] = "0123456789ABCDEFabcdef";

AnsiString text = "";
char  *in = inp.c_str();
char   ch, cl;

for (char c = *in; c; in++, c = *in)
{ if  (c == '+') { text += " ";    continue; }
else if (c != '%') { text += AnsiString(c);  continue; }

in++; ch = *in; if (!ch) break;
if (ch == '%')  { text += AnsiString(ch);  continue; }

in++; cl = *in; if (!cl) break;

c = 0x00;
for (int i=0; hex[i]; i++)
if (hex[i] == ch) { c = (  ((i > 15) ? (i-6<<4) : (i<< 4)) & 0xF0); break; }

for (int i=0; hex[i]; i++)
if (hex[i] == cl) { c |=(  ((i > 15) ? (i-6) : i) & 0x0F);  break; }


if (c) text += AnsiString(c);
}

return text;
}
Admin
Отправлено: 15.07.2005, 17:00


Владимир

Группа: Администратор
Сообщений: 1190



Ну вроде оно, только еще наверное добавить Utf8ToAnsi()

CODE



AnsiString s = "%d0%bd%d0%b0%d1%81%d1%82_52-43.txt";

s = WWWDeCode( s );
s = Utf8ToAnsi( s );

Edit2->Text = s; // получается: наст_52-43.txt



Отредактировано Admin — 15/07/2005, 17:28

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