Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] _INetExplorerCapable ($s_IEString). Обратное преобразование.

Ответить
Настройки темы
[решено] _INetExplorerCapable ($s_IEString). Обратное преобразование.

Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: SyDr
Дата: 21-04-2009
Есть строка - путь к файлу в интернете. В ней могут быть пробелы и другие символы, которые заменяются на %XX
Функция _INetExplorerCapable ($s_IEString) производит преобразование строки для совместимости с IE
Нужна функция или алгоритм, производящая(й) обратное преобразование.


Пробывал переписать по аналогии с _INetExplorerCapable($s_IEString). К сожалению, срабатывает только для строк, преобразованных АвтоИтом.
http://ru.wikipedia.org/wiki/Википедия
http://ru.wikipedia.org/wiki/%D0%92%...B4%D0%B8%D1%8F
Такую строку обратно преобразовать у меня не получилось.

Отправлено: 16:01, 21-04-2009

 

Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


скорее всего в вики, русские буквы в адресе ни как не кодируются, а обробатываются на 404,
либо при загрузке скриптом.

попробуйте напрямую работать с этим адресов - возможно все получтся.

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Отправлено: 02:32, 22-04-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата Sylver Dragon:
Такую строку обратно преобразовать у меня не получилось »
Вот так примерно можно:

Код: Выделить весь код
$URL = "http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F"

$sEncode_URL = _HexToURLString($URL)

ConsoleWrite($sEncode_URL)

Func _HexToURLString($sURLHex)
    Local $aURLHexSplit = StringSplit($sURLHex, "")
    Local $sRetString = "", $iDec, $iUbound = UBound($aURLHexSplit)

    For $i = 1 To $iUbound - 1
        If $aURLHexSplit[$i] = "%" And $i + 2 <= $iUbound - 1 Then
            $i += 2
            $iDec = Dec($aURLHexSplit[$i - 1] & $aURLHexSplit[$i])

            If Not @error Then
                $sRetString &= Chr($iDec)
            Else
                $sRetString &= $aURLHexSplit[$i - 2]
            EndIf
        Else
            $sRetString &= $aURLHexSplit[$i]
        EndIf
    Next

    ;_UTF8ToANSI($sUTF8):

    Local $sUTF8 = $sRetString

    Local $iLen = StringLen($sUTF8)
    Local $stBuf = DllStructCreate("byte[" & $iLen * 2 & "];byte[2]")

    Local $aRet = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
            "int", 65001, "int", 0, _
            "str", $sUTF8, "int", -1, _
            "ptr", DllStructGetPtr($stBuf), "int", $iLen * 2 + 2)

    Local $stOut = DllStructCreate("char[" & $iLen & "];char")

    $aRet = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
            "int", 0, "int", 0, _
            "ptr", DllStructGetPtr($stBuf), "int", -1, _
            "ptr", DllStructGetPtr($stOut), "int", $iLen + 1, _
            "int", 0, "int", 0)

    Return DllStructGetData($stOut, 1)
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 03:29, 22-04-2009 | #3


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


еще вариант (штатными средствами):
Код: Выделить весь код
$s_IEString = "http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%9F%D1%80%D0%B5%D1%81%D1%81-%D1%80%D0%B5%D0%BB%D0%B8%D0%B7%D1%8B"
ConsoleWrite(_INetExplorerCapableUndo($s_IEString) &@CRLF)

Func _INetExplorerCapableUndo($s_IEString)
    Local $a_IEChar = StringRegExp($s_IEString, "%[[:xdigit:]]{2}", 3)
    If IsArray($a_IEChar) Then
        For $i=0 To UBound($a_IEChar)-1
            $s_IEString = StringReplace($s_IEString, $a_IEChar[$i], Chr(Dec(StringTrimLeft($a_IEChar[$i],1))))
        Next
        $s_IEString = BinaryToString(StringToBinary($s_IEString, 4), 4)
    EndIf
    Return $s_IEString
EndFunc

Последний раз редактировалось amel27, 22-04-2009 в 06:38. Причина: оптимизация

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:41, 22-04-2009 | #4


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


Спасибо большое.
Первый вариант работает.

А второй - так же, как у меня. Строки, преобразованные через AutoIt он может обработать, а то, что нужно - нет:
http://ru.wikipedia.org/wiki/Википедия

Отправлено: 07:53, 22-04-2009 | #5


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Sylver Dragon:
А второй - так же, как у меня »
тогда так :
Код: Выделить весь код
$s_IEString = "http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%9F%D1%80%D0%B5%D1%81%D1%81-%D1%80%D0%B5%D0%BB%D0%B8%D0%B7%D1%8B"
MsgBox(0,"",_INetExplorerCapableUndo($s_IEString))

Func _INetExplorerCapableUndo($s_IEString)
    Local $a_IEChar = StringRegExp($s_IEString, "%[[:xdigit:]]{2}", 3)
    If IsArray($a_IEChar) Then
        For $i=0 To UBound($a_IEChar)-1
            $s_IEString = StringReplace($s_IEString, $a_IEChar[$i], Chr(Dec(StringTrimLeft($a_IEChar[$i],1))))
        Next
        $s_IEString = BinaryToString(StringToBinary($s_IEString), 4)
    EndIf
    Return $s_IEString
EndFunc
P.S. странно - первый вариант у меня выдал в консоль правильно, а на MsgBox() крякозябки
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:20, 22-04-2009 | #6


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


Всё. Теперь всё работает
Спасибо всем

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин


Отправлено: 08:24, 22-04-2009 | #7


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата amel27:
первый вариант у меня выдал в консоль правильно, а на MsgBox() крякозябки »
Т.к строка перекодирована в ANSI (твоя функция ).

Цитата amel27:
BinaryToString(StringToBinary($s_IEString), 4) »
Хм, получается UTF8 можно вот так просто перекодировать в ANSI?

Upd: Получается что да:

Код: Выделить весь код
$sANSI_String = "Тест"

$sUTF8_String = _StringANSIToUTF8($sANSI_String)
$sANSI_String = _StringUTF8ToANSI($sUTF8_String)

ConsoleWrite("UTF-8: " & $sUTF8_String & @CRLF)
ConsoleWrite("ANSI: " & $sANSI_String & @CRLF)

Func _StringANSIToUTF8($sString)
    Return BinaryToString(StringToBinary($sString, 4))
EndFunc

Func _StringUTF8ToANSI($sString)
    Return BinaryToString(StringToBinary($sString), 4)
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 15:14, 22-04-2009 | #8


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Creat0R:
Т.к строка перекодирована в ANSI »
не, я просто вернул строку обратно в UTF8, хотя и странным образом - как ANSI ... это видно из StringLen() ... получается, что ConsoleWrite() отображает UTF8, вот только не успел понять- всегда или в зависимости от настроек SciTE

Цитата Creat0R:
Хм, получается UTF8 можно вот так просто перекодировать в ANSI? »
угу, начиная не помню с какой версии, и не только UTF8, но и UTF16... жаль OEM нельзя

Последний раз редактировалось amel27, 23-04-2009 в 02:56.


Отправлено: 02:41, 23-04-2009 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] _INetExplorerCapable ($s_IEString). Обратное преобразование.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
V. 5.5/2000/2003 - [решено] Обратное разрешение ip адреса сервера-отправителя migunov Microsoft Exchange Server 1 22-01-2010 10:37
MSFT SQL Server - [решено] Преобразование скрипта для Oracle в скрипт для SQL EvgeniyQQQ Программирование и базы данных 3 25-03-2009 01:26
Доступ - общий доступ - "обратное" наследование Busla Microsoft Windows Vista 1 07-09-2008 21:01
[решено] XLT преобразование как метод разделения программы и дизайна! Vlad Drakula Вебмастеру 2 22-06-2006 21:22
Преобразование писем из ОЕ badze Хочу все знать 2 16-09-2005 08:02




 
Переход