Функции UrlEscape() из библиотеки shlwapi.lib и InternetCanonicalizeUrl() из Wininet.lib работают только со специальными символами и не работают с кириллицей. Других возможностей не нашёл. Пытался сам брать символы в utf-8 и ставить % перед байтами, но printf на кириллицу в c++builder не правильно работает. Ещё пытался сделать так:
Code: Select all
UnicodeString("%") + UnicodeString().IntToHex((int) 'М', 2));
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]));
}
}