Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0... - VB
Формулировка задачи:
Есть путь к файлу:
C:\Documents and Settings\Дима\Рабочий стол\sanctuary.wav
Правильная строка для IVR должна быть (это из лога, когда я подаю на вход только имя файла с путем, а конструируется все в C++ dll):
"ivr:
"
Но мне надо в нек. случаях сконструировать подобное выражение в VB6 и подать ivrXml целиком.
Ну накатал ф-цию наспех:
XML русский язык в чистом виде не ест, хочет хексы с процентами.
Как эту абракодабру получить как он хочет?
C:\Documents and Settings\Дима\Рабочий стол\sanctuary.wav
Правильная строка для IVR должна быть (это из лога, когда я подаю на вход только имя файла с путем, а конструируется все в C++ dll):
"ivr:
Но мне надо в нек. случаях сконструировать подобное выражение в VB6 и подать ivrXml целиком.
Ну накатал ф-цию наспех:
Ну и естественно накололся с приведенным вверху примером russian path:
XML русский язык в чистом виде не ест, хочет хексы с процентами.
Как эту абракодабру получить как он хочет?
Решение задачи: «Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0...»
textual
Листинг программы
PString PURL::TranslateString(const PString & str, TranslationType type)
{
PString xlat = str;
/* Characters sets are from RFC2396.
The EBNF defines lowalpha, upalpha, digit and mark which are always
allowed. The reserved list consisting of ";/?:@&=+$," may or may not be
allowed depending on the syntatic element being encoded.
*/
PString safeChars = "abcdefghijklmnopqrstuvwxyz" // lowalpha
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" // upalpha
"0123456789" // digit
"-_.!~*'()"; // mark
switch (type) {
case LoginTranslation :
safeChars += ";&=+$,"; // Section 3.2.2
break;
case PathTranslation :
safeChars += ":@&=+$,|"; // Section 3.3
break;
case ParameterTranslation :
/* By strict RFC2396/3.3 this should be as for PathTranslation, but many
URI schemes have parameters of the form key=value so we don't allow
'=' character in the allowed set. Also, including one of "@,|" is
incompatible with some schemes, leave those out too. */
safeChars += ":&+$";
break;
case QuotedParameterTranslation :
safeChars += "[]/:@&=+$,|";
return str.FindSpan(safeChars) != P_MAX_INDEX ? str.ToLiteral() : str;
default :
break; // Section 3.4, no reserved characters may be used
}
PINDEX pos = (PINDEX)-1;
while ((pos = xlat.FindSpan(safeChars, pos+1)) != P_MAX_INDEX)
xlat.Splice(psprintf("%%%02X", (BYTE)xlat[pos]), pos, 1);
return xlat;
}