Преобразование строки кириллицы в url-запросе в escape-последовательность

Информация, статьи, патчи, исходные коды и т.д.
Post Reply
sva
Администратор
Posts: 125
Joined: 01 May 2015, 19:56

Преобразование строки кириллицы в url-запросе в escape-последовательность

Post by sva »

Как на c++ builder 2010 или Embarcodero RAD Studio 2010 осуществить кодировку кириллицы в url-запросе в escape-последовательность?
Функции UrlEscape() из библиотеки shlwapi.lib и InternetCanonicalizeUrl() из Wininet.lib работают только со специальными символами и не работают с кириллицей. Других возможностей не нашёл. Пытался сам брать символы в utf-8 и ставить % перед байтами, но printf на кириллицу в c++builder не правильно работает. Ещё пытался сделать так:

Code: Select all

UnicodeString("%") + UnicodeString().IntToHex((int) 'М', 2));
но тоже не работает с кириллицей. Все функции, что нашёл в интернете либо английских авторов и не расчитаны на кириллицу, либо используют особенности c++builder, которые некорректно работают с кириллицей. В итоге пришлось сделать самому так:

Code: Select all

AnsiString char2esc( char *c ){
  switch(c[0]){
   case 'А': return(AnsiString("%D0%90"));
   case 'Б': return(AnsiString("%D0%91"));
   case 'В': return(AnsiString("%D0%92"));
   case 'Г': return(AnsiString("%D0%93"));
   case 'Д': return(AnsiString("%D0%94"));
   case 'Е': return(AnsiString("%D0%95"));
   case 'Ж': return(AnsiString("%D0%96"));
   case 'З': return(AnsiString("%D0%97"));
   case 'И': return(AnsiString("%D0%98"));
   case 'Й': return(AnsiString("%D0%99"));
   case 'К': return(AnsiString("%D0%9A"));
   case 'Л': return(AnsiString("%D0%9B"));
   case 'М': return(AnsiString("%D0%9C"));
   case 'Н': return(AnsiString("%D0%9D"));
   case 'О': return(AnsiString("%D0%9E"));
   case 'П': return(AnsiString("%D0%9F"));
   case 'Р': return(AnsiString("%D0%A0"));
   case 'С': return(AnsiString("%D0%A1"));
   case 'Т': return(AnsiString("%D0%A2"));
   case 'У': return(AnsiString("%D0%A3"));
   case 'Ф': return(AnsiString("%D0%A4"));
   case 'Х': return(AnsiString("%D0%A5"));
   case 'Ц': return(AnsiString("%D0%A6"));
   case 'Ч': return(AnsiString("%D0%A7"));
   case 'Ш': return(AnsiString("%D0%A8"));
   case 'Щ': return(AnsiString("%D0%A9"));
   case 'Ъ': return(AnsiString("%D0%AA"));
   case 'Ы': return(AnsiString("%D0%AB"));
   case 'Ь': return(AnsiString("%D0%AC"));
   case 'Э': return(AnsiString("%D0%AD"));
   case 'Ю': return(AnsiString("%D0%AE"));
   case 'Я': return(AnsiString("%D0%AF"));

   case 'а': return(AnsiString("%D0%B0"));
   case 'б': return(AnsiString("%D0%B1"));
   case 'в': return(AnsiString("%D0%B2"));
   case 'г': return(AnsiString("%D0%B3"));
   case 'д': return(AnsiString("%D0%B4"));
   case 'е': return(AnsiString("%D0%B5"));
   case 'ж': return(AnsiString("%D0%B6"));
   case 'з': return(AnsiString("%D0%B7"));
   case 'и': return(AnsiString("%D0%B8"));
   case 'й': return(AnsiString("%D0%B9"));
   case 'к': return(AnsiString("%D0%BA"));
   case 'л': return(AnsiString("%D0%BB"));
   case 'м': return(AnsiString("%D0%BC"));
   case 'н': return(AnsiString("%D0%BD"));
   case 'о': return(AnsiString("%D0%BE"));
   case 'п': return(AnsiString("%D0%BF"));

   case 'р': return(AnsiString("%D1%80"));
   case 'с': return(AnsiString("%D1%81"));
   case 'т': return(AnsiString("%D1%82"));
   case 'у': return(AnsiString("%D1%83"));
   case 'ф': return(AnsiString("%D1%84"));
   case 'х': return(AnsiString("%D1%85"));
   case 'ц': return(AnsiString("%D1%86"));
   case 'ч': return(AnsiString("%D1%87"));
   case 'ш': return(AnsiString("%D1%88"));
   case 'щ': return(AnsiString("%D1%89"));
   case 'ъ': return(AnsiString("%D1%8A"));
   case 'ы': return(AnsiString("%D1%8B"));
   case 'ь': return(AnsiString("%D1%8C"));
   case 'э': return(AnsiString("%D1%8D"));
   case 'ю': return(AnsiString("%D1%8E"));
   case 'я': return(AnsiString("%D1%8F"));

   case 'Ё': return(AnsiString("%D0%01"));
   case 'ё': return(AnsiString("%D1%91"));

   case '+': return(AnsiString("%2B"));
   //case '!': return(AnsiString("%D1%91"));
   case '@': return(AnsiString("%40"));
   case '#': return(AnsiString("%23"));
   case '$': return(AnsiString("%24"));
   case '%': return(AnsiString("%25"));
   case '^': return(AnsiString("%5E"));
   case '&': return(AnsiString("%26"));
   case '*': return(AnsiString("%2A"));
   case '(': return(AnsiString("%28"));
   case ')': return(AnsiString("%29"));
   //case '_': return(AnsiString("%D1%91"));
   case '|': return(AnsiString("%7C"));

   case ' ': return(AnsiString("+"));
   default:  return(AnsiString((char)c[0]));
  }
}
Post Reply