Что нового

Encoding UDF - Библиотека для работы с кодировками строк

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Может _Encoding_GetFileEncoding стоит упразднить? Есть же нативная FileGetEncoding. Ну или сделать функцию, которая определит кодировку не в файле, а в данных. Файл то мы и сами открывать умеем.
 

Nazgul666

Знающий
Сообщения
21
Репутация
9
Недавно потребовалось перевести русские символы в URL encode, но что-то средствами данной библиотеки мне не удалось достигнуть требуемого результата, пришлось реализовывать самому:

Код:
Func _RusToURL_Encode($URL)
$result=''
Local $aArray = StringSplit($URL,'')

For $i=1 To $aArray[0]
	If Hex(Asc($aArray[$i]), 2) = 20 Then
		$result&= "+";здесь вместо пробела в моем случае требовался именно плюс, без этого условия преобразует пробел в %20
	Else
		$result&= '%'&Hex(Asc($aArray[$i]), 2)
	EndIf
Next
return $result
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Nazgul666
есть правильный вариант, а не то что у вас.
Код:
Func __WinHttpURLEncode($sData, $iEncoding = 1)
	Local $aData = StringToASCIIArray($sData, Default, Default, $iEncoding) 
	Local $sOut
	For $i = 0 To UBound($aData) - 1
		Switch $aData[$i]
			Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126
				$sOut &= Chr($aData[$i])
			Case 32
				$sOut &= "+"
			Case Else
				$sOut &= "%" & Hex($aData[$i], 2)
		EndSwitch
	Next
	Return $sOut
EndFunc   ;==>__WinHttpURLEncode
 

valldar

Новичок
Сообщения
32
Репутация
2
Мне нужно строку кодировать в URL
Т.е. строка
Код:
seller_name=Вася Пупкин&[email protected]&desc=описание
должно превратиться в
Код:
seller_name%3D%26%231042%3B%26%231072%3B%26%231089%3B%26%231103%3B+%26%231055%3B%26%231091%3B%26%231087%3B%26%231082%3B%26%231080%3B%26%231085%3B%26email%3Demail%40mail.com%26desc%3D%26%231086%3B%26%231087%3B%26%231080%3B%26%231089%3B%26%231072%3B%26%231085%3B%26%231080%3B%26%231077%3B

Здесь в наборе есть такая функция?

Добавлено
Прочитал предыдущий пост, все понял))
Добавлено
Помучавшись пришел к следующему:
Для функции StringFromASCIIArray в примере inververs, параметр encoding поменял на 2 (UTF-8)
Код:
Func __WinHttpURLEncode($sData, $iEncoding = 2)


И кодировать нужно не всю строку!
seller_name=Вася Пупкин&[email protected]&desc=описание
а только значения, т.е. грубо говоря вот так:
Код:
$dataToSend='seller_name='&__WinHttpURLEncode('Вася Пупкин', $iEncoding = 2)&'&email='&__WinHttpURLEncode('[email protected]', $iEncoding = 2)&'&desc='&__WinHttpURLEncode('описание', $iEncoding = 2)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
CreatoR,
Код:
StringFromASCIIArray(StringToASCIIArray("Инструкция по установке.htm", 0, Default, 0), 0, Default, 2)


Каким образом Вам удалось вставить строку "Инструкция по установке.htm" прямо в код скрипта?
Каким редактором?
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Почему в _Encoding_KOI8To1251 первым идет
Код:
Case $iCode = 63
	$VarKOIArr[$i] = Chr(185)

?
У меня в итоге все "?" превращаются в "№".
 

Hemul_Y

Новичок
Сообщения
3
Репутация
0
Подскажите как правильно раскодировать строку в UTF8 (без BOM)?
Код:
$sString = '=D0=A1=D0=BB=D0=B0=D0=B2=D0=B0=20=D0=9A=D0=B0=D0=BB=D0=B0=D1=87=D0=B5=D0=B2'
$ANSI = _Encoding_QuotedPrintableToANSI($sString)
$UTF8DecodedString = _Encoding_ANSIToUTF8($ANSI)

таким методом не получется

В дальнейшем используйте теги AutoIt.
madmasles.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Hemul_Y [?]
раскодировать строку
Код:
$sString = '=D0=A1=D0=BB=D0=B0=D0=B2=D0=B0=20=D0=9A=D0=B0=D0=BB=D0=B0=D1=87=D0=B5=D0=B2'
$sConvert = BinaryToString("0x" & StringReplace($sString, "=", ""), 4)
ConsoleWrite($sConvert & @CRLF)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include "Encoding.au3"

$sString = '=D0=A1=D0=BB=D0=B0=D0=B2=D0=B0=20=D0=9A=D0=B0=D0=BB=D0=B0=D1=87=D0=B5=D0=B2'
$sString = _Encoding_QuotedPrintableToANSI($sString)

If _Encoding_IsUTF8Format($sString) Then
	$sString = _Encoding_UTF8ToANSI($sString)
EndIf

MsgBox(64, 'Title', $sString)


Название функции неудачное, наверное должно быть _Encoding_QuotedPrintableDecode.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вообще есть идея положить на сервер php скрипт, который будет принимать параметры, и выдавать результат, который позже будет обрабатываться AutoIt скриптом.
По аналогии с этим.

Типа так:

Код:
$sString = '=D0=A1=D0=BB=D0=B0=D0=B2=D0=B0=20=D0=9A=D0=B0=D0=BB=D0=B0=D1=87=D0=B5=D0=B2'
$sString = _Encoding_RemoteEncode($sString, 'quoted_printable_decode')

MsgBox(64, 'Title', $sString)

Func _Encoding_RemoteEncode($sStr, $sEncoding, $bUnicode = True)
	$sStr = BinaryToString(InetRead(StringFormat('http://autoit-script.ru/Tools/encode.php?str=%s&enc=%s', $sStr, $sEncoding)), $bUnicode ? 4 : 0)
	
	Return $sStr
EndFunc


Собственно вот сам скрипт:

PHP:
<?php

$sStr = $_GET['str'];
$sEncoding = $_GET['enc'];

echo $sEncoding($sStr);

?>
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пару примеров:

Код:
$sString = 'тест'
$sString = _Encoding_RemoteEncode($sString, 'utf8_encode', False)
MsgBox(64, 'Title', $sString)

$sString = _Encoding_RemoteEncode($sString, 'utf8_decode', False)
MsgBox(64, 'Title', $sString)

$sString = _Encoding_RemoteEncode($sString, 'base64_encode', False)
MsgBox(64, 'Title', $sString)

$sString = _Encoding_RemoteEncode($sString, 'base64_decode', False)
MsgBox(64, 'Title', $sString)

Func _Encoding_RemoteEncode($sStr, $sEncoding, $bUnicode = True)
	$sStr = BinaryToString(InetRead(StringFormat('http://autoit-script.ru/Tools/encode.php?str=%s&enc=%s', $sStr, $sEncoding)), $bUnicode ? 4 : 0)
	
	Return $sStr
EndFunc
 

Hemul_Y

Новичок
Сообщения
3
Репутация
0
CreatoR сказал(а):
Код:
#include "Encoding.au3"

$sString = '=D0=A1=D0=BB=D0=B0=D0=B2=D0=B0=20=D0=9A=D0=B0=D0=BB=D0=B0=D1=87=D0=B5=D0=B2'
$sString = _Encoding_QuotedPrintableToANSI($sString)

If _Encoding_IsUTF8Format($sString) Then
	$sString = _Encoding_UTF8ToANSI($sString)
EndIf

MsgBox(64, 'Title', $sString)


Название функции неудачное, наверное должно быть _Encoding_QuotedPrintableDecode.


InnI сказал(а):
Hemul_Y [?]
раскодировать строку
Код:
$sString = '=D0=A1=D0=BB=D0=B0=D0=B2=D0=B0=20=D0=9A=D0=B0=D0=BB=D0=B0=D1=87=D0=B5=D0=B2'
$sConvert = BinaryToString("0x" & StringReplace($sString, "=", ""), 4)
ConsoleWrite($sConvert & @CRLF)

Огромное спасибо. Оба варианта работают.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
А если подключение к интернету будет отсутствовать или сайт будет недоступен? :smile:
 

SlavaS

Знающий
Сообщения
35
Репутация
5
Добрый день,
Обнаружил что функция _Encoding_UTF8BOMDecode возвращает неправильно букву Я (заглавную), например КРАСНОßРСКИЙ КРАЙ вместо КРАСНОЯРСКИЙ КРАЙ, если маленькие буквы то все нормально.
 

Cornet

Знающий
Сообщения
41
Репутация
6
Ошибка в функции _Encoding_UTF8ToUnicode_API
Слишком большой буфер делается.
Попробуйте код:
Код:
$x = Encoding_UTF8ToUnicode_API("Женя")
ConsoleWrite("длинна: " & StringLen($x) & '   ' & $x & @CRLF)

Я сделал добавил после строки:
Код:
$UnicodeHex3 = StringMid($UnicodeHex2, 3, 2) & StringMid($UnicodeHex2, 1, 2)

строку:
Код:
If $UnicodeHex3 = "0000" Then ExitLoop

наверное есть способ правильно размер буфера посчитать — но мне лень)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
Func _Encoding_UTF8ToUnicode_API($sUTF8_String)
	Local $iBufferSize = StringLen($sUTF8_String)
	Local $stBuffer = DllStructCreate("byte[" & $iBufferSize & "]")
	
	DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
			"int", 65001, _
			"int", 0, _
			"str", $sUTF8_String, _
			"int", StringLen($sUTF8_String), _
			"ptr", DllStructGetPtr($stBuffer), _
			"int", $iBufferSize)
	
	Local $bUnicodeBinary = DllStructGetData($stBuffer, 1)
	Local $nUnicodeHex = StringReplace($bUnicodeBinary, "0x", "")
	Local $iStrLen = StringLen($nUnicodeHex)
	Local $nHexTmp, $sRet
	
	For $i = 1 To $iStrLen Step 4
		$nHexTmp = StringMid($nUnicodeHex, $i, 4)
		$sRet &= ChrW(Dec(StringMid($nHexTmp, 3, 2) & StringMid($nHexTmp, 1, 2)))
	Next
	
	Return $sRet
EndFunc
 

Cornet

Знающий
Сообщения
41
Репутация
6
Не работает на длинной фразе:
Код:
длинная длинааяяяяя фраза которая обрезается
должно получиться «длинная длинааяяяяя фраза которая обрезается»
а получается «длинная длинааяяяяя фраза которая обрезает»
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
Func _Encoding_UTF8ToUnicode_API($sUTF8_String)
    Local $iBufferSize = StringLen($sUTF8_String)
    Local $stBuffer = DllStructCreate("byte[" & $iBufferSize * 2 & "]")
    
    DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
            "int", 65001, _
            "int", 0, _
            "str", $sUTF8_String, _
            "int", StringLen($sUTF8_String), _
            "ptr", DllStructGetPtr($stBuffer), _
            "int", $iBufferSize)
    
    Local $bUnicodeBinary = DllStructGetData($stBuffer, 1)
    Local $nUnicodeHex = StringReplace($bUnicodeBinary, "0x", "")
    Local $iStrLen = StringLen($nUnicodeHex)
    Local $nHexTmp, $sRet
    
    For $i = 1 To $iStrLen Step 4
        $nHexTmp = StringMid($nUnicodeHex, $i, 4)
		$iDecTmp = Dec(StringMid($nHexTmp, 3, 2) & StringMid($nHexTmp, 1, 2))
		
		If $iDecTmp Then
			$sRet &= ChrW($iDecTmp)
		EndIf
    Next
    
    Return $sRet
EndFunc
 
Верх