Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > URL Encode


Автор: Kasiro 11.7.2011, 22:57
Всем привет. Нужно русский текст перевести в "незнаю как это называется"
Пример Тест = %D0%A2%D0%B5%D1%81%D1%82

нашёл исходники http://stackoverflow.com/questions/154536/encode-decode-urls-in-c
они пашут только мне выдаётся не то что нужно, какой то другой код который гугл тоже понимает, но нужен другой

пример: выдаёт %F2%E5%F1%F2, а мне нужно %D1%82%D0%B5%D1%81%D1%82 и то и другое гугл воспринял как "тест", но нужно кодирование именно во второй вариант

пожалуйста какие есть идеи и предложения)

Автор: artsb 11.7.2011, 23:18
Цитата(Kasiro @  11.7.2011,  22:57 Найти цитируемый пост)
"незнаю как это называется"

Это quoted printable. Начните изучение http://en.wikipedia.org/wiki/Quoted-printable.

Добавлено через 1 минуту и 52 секунды
Цитата(Kasiro @  11.7.2011,  22:57 Найти цитируемый пост)
%F2%E5%F1%F2, а мне нужно %D1%82%D0%B5%D1%81%D1%82

Судя по количеству закодированных байт, первое это однобайтовая кодировка (возможно, windows-1251), а вторая двухбайтовая (возможно, utf-16).

Автор: volatile 12.7.2011, 00:06
Цитата(artsb @  11.7.2011,  23:18 Найти цитируемый пост)
а вторая двухбайтовая (возможно, utf-16). 

UTF-8
D1 82 D0 B5 D1 81 D1 82 <= тест




Автор: artsb 12.7.2011, 08:08
Цитата(volatile @  12.7.2011,  00:06 Найти цитируемый пост)

UTF-8
D1 82 D0 B5 D1 81 D1 82 <= тест

Я понимаю. Поэтому я и написал "возможно". Кстати, английские символы в кодировке utf-8 имеют размер 1 байт, а не 2.

Цитата(artsb @  11.7.2011,  23:18 Найти цитируемый пост)
Это quoted printable.

Сори. Малость напутал. Это URL Encoding. Почитать можно http://ru.wikipedia.org/wiki/URI_encoding#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_URL.
В принципе, разница только в том, что в quoted printable в качестве спец символа используется "=", а в URL Encoding - "%". Остальное, вроде бы, так же.

Автор: Kasiro 12.7.2011, 08:45
Спасибо большое, прочитал.
Может есть у кого то готовый код который енкодил бы текст?

Автор: srt 12.7.2011, 10:11
Код

h:

void __fastcall TForm1::Url64(TObject *Sender);

cpp:

void __fastcall TForm1::Url64(TObject *Sender) //кто спросил тот и получил :О) (fnlm ответом буит)
{
AnsiString Inp;
Inp = Records->Text; // шо нуно энкодить

AnsiString InpU = "";
int nc = Inp.Length();
for (int u = 1; u <= nc; u++){
if(AnsiStrScan("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*$!@.,'-_", Inp[u]) == NULL){
InpU += "%" + IntToHex((byte)Inp[u],2);
}else{
InpU += Inp[u];
}
}

AnsiString strOut;
const static char base64ABC[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const char* strIn = InpU.c_str();
strOut = "";
const size_t len = strlen(strIn);
for(unsigned int k = 0; k < len; k += 3) {
LONG l = (((LONG)strIn[k]) << 16) | (((k + 1) < len) ? (((LONG)strIn[k+1]) << 8) : 0) | (((k+2) < len) ? ((LONG)strIn[k+2]) : 0);
strOut += base64ABC[(l >> 18) & 0x3F];
strOut += base64ABC[(l >> 12) & 0x3F];
if(k+1 < len){strOut += base64ABC[(l >> 6) & 0x3F];}
if(k+2 < len){strOut += base64ABC[(l ) & 0x3F];}
}
switch (len%3){
case 1:
strOut += '=';
case 2:
strOut += '=';
}
fnlm = fnlm + "&mess[" + AnsiString(nn) + "]=" + strOut;
//fnlm = fnlm + Inp;
}

сначала урлэнкод потом в бэйз64 загоняется, выбери себе и подрихтуй :О)
сделал потомучто родные функции почемуто очень тормозные (я про 6 версию)
в мультибайт сами переведёте smile ежли нуна

Автор: artsb 12.7.2011, 11:35
Цитата(Kasiro @  12.7.2011,  08:45 Найти цитируемый пост)
Может есть у кого то готовый код который енкодил бы текст?

А что там делать то?


Автор: Kasiro 12.7.2011, 12:33
srt, спасибоsmile

Автор: Kasiro 16.7.2011, 15:53
Ребят, чёто я невкурю как перевести это дело в мультибайт

Код

UnicodeString TMainForm::UrlEncode(UnicodeString Inp)
{
Inp=AnsiToUtf8(Inp);
UnicodeString InpU = "";
int nc = Inp.Length();
for (int u = 1; u <= nc; u++){
if(StrScan((wchar_t*)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*$!@.,'-_", (wchar_t)Inp[u]) == NULL){
wchar_t tmp=Inp[u];
InpU += "%" + IntToHex((byte)tmp,2);
}else{
InpU += Inp[u];
}
}

return InpU;
}


тут я уже методом тыка начал, получаю такую строку: тест = "%42%35%41%42"

Автор: artsb 16.7.2011, 19:00
Код

union UUnicodeBytes {
    wchar_t UnicodeChar;
    char AnsiChars[2];
};
// ...
UnicodeString TMainForm::UrlEncode(UnicodeString Inp) {
    UUnicodeBytes uBytes;
    UnicodeString Result = "";

    for(register int i = 1; i <= Inp.Length(); i++) {
        if(wcschr(L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*$!@.,'-_", Inp[i]) == NULL){
            uBytes.UnicodeChar = Inp[i];

            Result += "%" + IntToHex(uBytes.AnsiChars[1], 2);
            Result += "%" + IntToHex(uBytes.AnsiChars[0], 2);
        }
        else {
            Result += Inp[i];
        }
    }

    return Result;
}

Автор: Kasiro 16.7.2011, 20:26
artsb, спасибо большое!
влепил себе этот код, на тест получил -  "%04%42%04%35%04%41%04%42"
мож неправильно что то делаю?

Автор: artsb 16.7.2011, 20:53
Цитата(Kasiro @  16.7.2011,  20:26 Найти цитируемый пост)
мож неправильно что то делаю? 

а что неправильного в строке?

Добавлено через 1 минуту и 58 секунд
Цитата(Kasiro @  11.7.2011,  22:57 Найти цитируемый пост)
а мне нужно %D1%82%D0%B5%D1%81%D1%82

А, вы про это? Так в примере выше кодируется UTF-16. А строка в комментарии - это закодированный UTF-8.

Автор: artsb 16.7.2011, 21:48
Пробуйте так:
Код

UnicodeString TMainForm::UrlEncode2(UnicodeString Inp) {
    UnicodeString Result = "";
    char *UTF8String;
    int iStrLen;

    // convert to UTF-8
    iStrLen = WideCharToMultiByte(CP_UTF8, 0, Inp.c_str(), -1, NULL, 0, NULL, NULL);
    if(iStrLen < 1) {
        return L"";
    }

    try {
        UTF8String = new char[iStrLen];
    }
    catch(...) {
        UTF8String = NULL;
    }

    if(UTF8String == NULL) {
        return L"";
    }

    iStrLen = WideCharToMultiByte(CP_UTF8, 0, Inp.c_str(), -1, UTF8String, iStrLen, NULL, NULL);
    if(iStrLen < 1) {
        delete [] UTF8String;
        return L"";
    }

    iStrLen--;
    // URL Encoding
    for(register int i = 0; i < iStrLen; i++) {
        if(strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*$!@.,'-_", UTF8String[i]) == NULL) {
            Result += L"%" + IntToHex(UTF8String[i] & 0xFF, 2);
        }
        else {
            Result += (wchar_t)UTF8String[i];
        }
    }

    delete [] UTF8String;

    return Result;
}

Автор: Kasiro 16.7.2011, 22:03
artsb, а можете подсказать что нужно изменить чтобы было %D1%82%D0%B5%D1%81%D1%82 ?)

Автор: Kasiro 16.7.2011, 23:02
artsb, Урааа))) работает)) премного благодарен! больше спасибо!))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)