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
|
|