Поиск:

Ответ в темуСоздание новой темы Создание опроса
> URL Encode, переконвертить русс текст как в гугле 
:(
    Опции темы
Kasiro
Дата 11.7.2011, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 11.7.2010

Репутация: нет
Всего: -1



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

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

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

пожалуйста какие есть идеи и предложения)
PM MAIL   Вверх
artsb
Дата 11.7.2011, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

Это 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).


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
volatile
Дата 12.7.2011, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 3
Всего: 85



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

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




PM MAIL   Вверх
artsb
Дата 12.7.2011, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(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. Почитать можно здесь.
В принципе, разница только в том, что в quoted printable в качестве спец символа используется "=", а в URL Encoding - "%". Остальное, вроде бы, так же.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Kasiro
Дата 12.7.2011, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 11.7.2010

Репутация: нет
Всего: -1



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

PM MAIL   Вверх
srt
Дата 12.7.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.5.2008

Репутация: нет
Всего: 1



Код

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 ежли нуна
PM MAIL   Вверх
artsb
Дата 12.7.2011, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

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




--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Kasiro
Дата 12.7.2011, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 11.7.2010

Репутация: нет
Всего: -1



srt, спасибоsmile
PM MAIL   Вверх
Kasiro
Дата 16.7.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 11.7.2010

Репутация: нет
Всего: -1



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

Код

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"
PM MAIL   Вверх
artsb
Дата 16.7.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Код

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



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Kasiro
Дата 16.7.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 11.7.2010

Репутация: нет
Всего: -1



artsb, спасибо большое!
влепил себе этот код, на тест получил -  "%04%42%04%35%04%41%04%42"
мож неправильно что то делаю?
PM MAIL   Вверх
artsb
Дата 16.7.2011, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(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.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 16.7.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Пробуйте так:
Код

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


Это сообщение отредактировал(а) artsb - 16.7.2011, 21:51


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Kasiro
Дата 16.7.2011, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 11.7.2010

Репутация: нет
Всего: -1



artsb, а можете подсказать что нужно изменить чтобы было %D1%82%D0%B5%D1%81%D1%82 ?)
PM MAIL   Вверх
Kasiro
Дата 16.7.2011, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 11.7.2010

Репутация: нет
Всего: -1



artsb, Урааа))) работает)) премного благодарен! больше спасибо!))

Это сообщение отредактировал(а) Kasiro - 17.7.2011, 10:13
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.