Что нового

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

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Dalm
Вам уже писали в другой теме:
вы бы хоть мало-мальски постарались описать задачу. Уже ведь не новичек на форуме,
... а вы опять на те же грабли... Написали два слова и ждете помощи, а ее не будет. Почему?
Появляются крякозябры типа: Второй текст 1
Читая это у меня возникает больше вопросов чем ответов:
- Что за текст;
- откуда он берется (считан он из файла или сгенерированн скриптом);
- а как вы его считываете;
- почему вы решили его перекодировать;
- причем тут вообще Encoding UDF;
- в какой кодировке сам файл скрипта;
- какая версия Autoit?

Лучше создайте отдельную тему, в которой очень подробно опишите проблему, при возможности приложите тестовый скрипт для демонстрации этой проблемы.
 
Последнее редактирование:

LogA

Новичок
Сообщения
1
Репутация
0
Автор, спасибо за труд!
Решил свою проблему - создавал файл FileOpen с параметрами для UTF8 , читал информацию с сайта (на сайт content="text/html; charset=UTF-8" ) через пользовательские функции "IE Management", получал текст через функции _IE в формате ANSI, писал в файл, получалось каша, формат файла UTF8, а внутри строки в ANSI.
Для исправления стал делать преобразования ANSI->UTF8 , и всё получилось!
Единственно SciTe выдавал предупреждение
"R:\AutoiT\install\Include\Encoding.au3"(194,13) : warning: $a_Call possibly not declared/created yet

Код:
Func _Encoding_Base64Decode($sData)
    Local $struct = DllStructCreate("int")
    
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
            "str", $sData, _
            "int", 0, _
            "int", 1, _
            "ptr", 0, _
            "ptr", DllStructGetPtr($struct, 1), _
            "ptr", 0, _
            "ptr", 0)
    
    If @error Or Not $a_Call[0] Then
        Return SetError(1, 0, "") ; error calculating the length of the buffer needed
    EndIf
    
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
    
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
            "str", $sData, _
            "int", 0, _
            "int", 1, _
            "ptr", DllStructGetPtr($a), _
            "ptr", DllStructGetPtr($struct, 1), _
            "ptr", 0, _
            "ptr", 0)
    
    If @error Or Not $a_Call[0] Then
        Return SetError(2, 0, "") ; error decoding
    EndIf
    
    Return BinaryToString(DllStructGetData($a, 1))
EndFunc ;==>_Encoding_Base64Decode

хотя я эту функцию даже не использовал. Работать не мешает, но возможно эта информация пригодиться.
Система на W7 x64
 

Norm

Продвинутый
Сообщения
269
Репутация
70
В библиотеке Encoding.au3
Не задекларирована локальная переменная $a_Call
Допишите впереди Local Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
 
  • Like
Реакции: LogA

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
Всем привет, наткнулся на очень медленную работу ряда функций, там где текст разбивается посимвольно или в цикле проверяется по длине текста - т.е. каждый символ. Если текст небольшой, то нормально, но если 1 мб и выше - очень долго, я написал свою версию _Encoding_GetCyrillicANSIEncoding и у меня возник вопрос - там обязательно должно присутствовать Asc() ? Это на что-то влияет? Возможно локальный язык системы...
Код:
Func _Encoding_GetCyrillicANSIEncoding($sLine)
;   Local $vTag,$n=0,$k=0,$j=0,$R=0,$aRet=StringSplit($sLine,'')
;   For $i=1 To $aRet[0]
;     $vTag=Asc($aRet[$i])
;     Switch $vTag
;       Case 192,224,200,232,206,238,210,242 ; АаИиОоТт
;        $n+=1
;      Case 128,160,136,168,142,174,146 ; Ђ €ЁЋ®’
;        $k+=1
;      Case 225,193,233,201,239,207,244,212 ; бБйЙпПфФ
;        $j+=1
;      Case 176,208,184,216,190,222,194 ; °РёШѕЮВ
;        $R+=1
;      Case 226 ; в
;        $k+=1
;        $R+=1
;     EndSwitch
;   Next
  Local $n,$k,$j,$R
  StringRegExpReplace($sLine,'(?i)[аиот]',0)
  $n=@extended
  StringRegExpReplace($sLine,'[Ђ €ЁЋ®’]',0)
  $k=@extended
  StringRegExpReplace($sLine,'(?i)[бйпф]',0)
  $j=@extended
  StringRegExpReplace($sLine,'[°РёШѕЮВ]',0)
  $R=@extended
  StringRegExpReplace($sLine,'в',0)
  $k+=@extended
  $R+=@extended
  If $j>=$n And $j>$k And $j>$R Then Return 'KOI8-R'
  If $n>$j And $n>$k And $n>$R Then Return 'WINDOWS-1251'
  If $k>$j And $k>$n And $k>$R Then Return 'IBM-866'
  If $R>$n And $R>$k And $R>$j Then Return 'ISO-8859-5'
  Return ''
EndFunc
 
Верх