Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0... - VB

Узнай цену своей работы

Формулировка задачи:

Есть путь к файлу:
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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5
Похожие ответы