powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0...
5 сообщений из 5, страница 1 из 1
Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0...
    #38010336
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть путь к файлу:
C:\Documents and Settings\Дима\Рабочий стол\sanctuary.wav

Правильная строка для IVR должна быть (это из лога, когда я подаю на вход только имя файла с путем, а конструируется все в C++ dll):
"ivr:<?xml version="1.0"?><vxml version="1.0"><form id="PlayFile"><audio src="file:///C|/Documents%20and%20Settings/%C4%E8%EC%E0/%D0%E0%E1%EE%F7%E8%E9%20%F1%F2%EE%EB/sanctuary.wav"/><goto next="#PlayFile"/></form></vxml>"

Но мне надо в нек. случаях сконструировать подобное выражение в VB6 и подать ivrXml целиком.
Ну накатал ф-цию наспех:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function PathForIVR(ByVal Path As String) As String
  'C:\Documents and Settings\All Users\Application Data\Proga\Sounds\failo.wav
  'file:///C|/Documents and Settings/All Users/Application Data/Proga\Sounds\failo.wav
  Dim str As String
  str = Path
  str = Replace(str, ":", "|")
  str = Replace(str, "\", "/")
  str = "file:///" & str
  PathForIVR = str
End Function

Ну и естественно накололся с приведенным вверху примером russian path:
Код: c#
1.
2.
3.
4.
Выдает
file:///C|/Documents and Settings/Дима/Рабочий стол/sanctuary.wav
надо
file:///C|/Documents%20and%20Settings/%C4%E8%EC%E0/%D0%E0%E1%EE%F7%E8%E9%20%F1%F2%EE%EB/sanctuary.wav



XML русский язык в чистом виде не ест, хочет хексы с процентами.
Как эту абракодабру получить как он хочет?
...
Рейтинг: 0 / 0
Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0...
    #38010358
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0...
    #38010477
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Данная функция приводит только к URL пути, ещё есть UrlEscape функция, но необходимую конверсию она не дала.
Есть способ через ScriptControl вызывать JavaScript функцию encodeURIComponent , но она кодирует в UTF-8.

По простому, можно как основу такую функцию взять и под себя делать.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function UrlEncode(Text)
    Dim i, char
    For i = 1 To Len(Text)
        char = Mid(Text, i, 1)
        If InStr(1, "0123456789abcdefghijklmnopqrstuvwxyz", char, 1) = 0 Then 
            if char = " " Then 
                char = "+" 
            Else
                char = "%" & Hex(Asc(char))
            End if
        End if
        UrlEncode = UrlEncode & char
    Next
End Function
...
Рейтинг: 0 / 0
Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0...
    #38010546
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,
Я вашу идею понял, но ваш вариант для приведенного примера пути
C:\Documents and Settings\Дима\Рабочий стол\sanctuary.wav
выдаст
Код: vbnet
1.
file%3A%2F%2F%2FC%7C%2FDocuments+and+Settings%2FAll+Users%2FApplication+Data%2FProga%2FSounds%2Ffailo%2Ewav


что не совсем соответствует нарисованному выше.
Т.е. отсебятина еще та.
Можно конечно допилить:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  str = UrlEncode(str)
  PathForIVR = str
End Function

Function UrlEncode(Text)
    Dim i, char
    For i = 1 To Len(Text)
        char = Mid(Text, i, 1)
        If InStr(1, "0123456789abcdefghijklmnopqrstuvwxyz/\|.:", char, 1) = 0 Then '
            'If char = " " Then
            '    char = "+"
            'Else
                char = "%" & Hex(Asc(char))
            'End If
        End If
        UrlEncode = UrlEncode & char
    Next
End Function


и тогда получим то же самое, но если файл например называется intro_wav_out.wav
то надо добавлять еще и _ в набор символов.
Т.е. надо точно понимать механизм, иначе обязательно где-нибудь выстрелит.

С другой стороны лишняя конвертация упомянутого _ в hex к ошибки не приводит, т.е. xml файл все одно найдет требуемый файл.
Но не хотелось бы рассчитывать на авось.
Хорошо бы воспроизвести именно то что делает ptlib. Но я смотрел эти цепочки кодов и ни фига пока не понял.
Можно конечно подцепиться/дописать Opal API (все равно прога на этот environment завязана и мне это не сложно хотя и чуть громоздко) и вернуть напрямую
Код: plaintext
1.
PURL(PFilePath(fileStr)) 

-тогда точно будет "что нады" без понимания что именно оно делает, но сдается мне это оч.дурной тон -перегружать телефонные API подобной фигней. Оно конечно не мультимедиа API, где я фактически дублирую опаловские C-шные коды чистыми VB6 кодами, но все же.
...
Рейтинг: 0 / 0
Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0...
    #38010614
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел в каком месте C-шная библиотека это делает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
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;
}


Не совсем правда понял какой case: используется в данном конкретном случае. По логике case PathTranslation : , но ; с-шный код тоже пропускает без изменений. Думаю безошибочный, избыточно полный вариант такой (lowalpha, upalpha дублировать смысла нет, т.к. Instr в данном виде регистр пофиг):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Public Function PathForIVR(ByVal Path As String) As String
  Dim str As String
  str = Path
  str = Replace(str, ":", "|")
  str = Replace(str, "\", "/")
  str = "file:///" & str
  str = UrlEncode(str)
  PathForIVR = str
End Function

Private Function UrlEncode(Text)
    Dim i, char
    For i = 1 To Len(Text)
        char = Mid(Text, i, 1)
        If InStr(1, "abcdefghijklmnopqrstuvwxyz0123456789-_.!~*'()[]/:@&=+$,|;\", char, 1) = 0 Then
          char = "%" & Hex(Asc(char))
        End If
        UrlEncode = UrlEncode & char
    Next
End Function


Во всяком случае файл с таким именем/путем (буквально):
Код: plaintext
1.
C:\Documents and Settings\Дима\Рабочий стол\приветствие_ав_()т  АА тW%е!   Ётч^и;@ $$ ка[].wav


съелся и проигрался без затруднений.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как сконвертировать строку в требуемый вид Documents%20and%20Settings/%C4%E8%EC%E0/%D0...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]