Что нового

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

Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
La2Angel [?]
microsoft security essentials - считает данную библиотеку за вирус при компиляции
Добавьте в исключения, и напишите в поддержку программы.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
CreatoR
Если открыть в HEX-редакторе, то в начале, перед #include-once есть три каких то служебных символа, которые обычные редакторы не видят, но из-за них при компиляции вылетает ошибка.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
AZJIO [?]
в начале, перед #include-once есть три каких то служебных символа, которые обычные редакторы не видят
Символы: ef bb bf. Не знаю, правильно ли это, но я их удалил, вроде на работу UDF это не повлияло.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO
это в файл затесался неюникодный символ, который позже был открыт "нехорошим редактором". это редактор заменил символ � который обычно появляется в текстах с юникод-кодом не входящим в таблицу на эти самые три байта. отсюда ноги и растут. подробнее читать тут Specials (Unicode block)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
brentoid

Я удалил твое сообщение, т.к. оно нарушает сразу -дцать правил форума. Не нужно больше здесь его размещать, и тем более на английском.

P.S

Lazyсat, насколько я знаю, русскоговорящий. :smile:
 

UnEpicFail

Новичок
Сообщения
24
Репутация
0
Доброго всем времени суток. У меня возникла проблема с скачанным архивом Encoding_UDF.zip. Не удается прочитать файл Encoding.au3, и это делает меня печальным. Скажите, это я делаю что то не так или так и задумано?
 

UnEpicFail

Новичок
Сообщения
24
Репутация
0
Garrett [?]
Что значить "не удается прочитать"?Архив целый, файлы тоже.

Распаковываю раром, пытаюсь открыть файл Encoding.au3 блокнотом получаю сообщение "Отказано в доступе".
Пытаюсь копировать файл получаю сообщение "Не удается скопировать Encoding. Нет доступа. Диск может быть переполнен или защищен от записи, либо файл занят другим приложением.", но любой другой спокойно копируется в туже папку.
Распаковываю в C:\Program Files\AutoIt3\Include, открываю эдитором пример из того де архива, запускаю, получаю ошибку
Код:
>"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Program Files\AutoIt3\Include\URI & Url To Hex Example.au3"    
C:\Program Files\AutoIt3\Include\URI & Url To Hex Example.au3 (1) : ==> Error opening the file.: 
#include <Encoding.au3> 

>Exit code: 1    Time: 0.210
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
UnEpicFail
Скачать второй раз не пробовал?
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
CreatoR
Посмотри:
1. бинарная строка
2. условие инвертировал

Код:
$hFile = FileOpen(@ScriptDir&'\Encoding.txt', 128)
$sText = FileRead($hFile)
FileClose($hFile)

MsgBox(0, 'Сообщение', _Encoding_UTF8BOMDecode($sText))

;Description: Converts UTF-8 (with BOM) string to ANSI encoding
;Author: amel27
Func _Encoding_UTF8BOMDecode($sString)
	Local $sRetStr, $iMidleStr, $iMidleStr_Pos, $iMidleStr_Chck

	Local $sDecodeStr = BinaryToString('0xC3A0C3A1C3A2C3A3C3A4C3A5C3A6C3A7C3A8C3A9C3AAC3ABC3ACC3ADC3AEC3AFC3B0C3B1C3B2C3B3C3B4C3B5C3B6C3B7C3B8C3B9C3BCC3BBC3BDC3BEC3BF', 4)
	Local $sEncodeStr = 'абвгдежзийклмнопрстуфхцчшщьыэюя'

	For $i = 1 To StringLen($sString)
		$iMidleStr = StringMid($sString, $i, 1)
		$iMidleStr_Pos = StringInStr($sDecodeStr, $iMidleStr)

		If $iMidleStr_Pos Then
			$iMidleStr_Chck = StringMid($sEncodeStr, $iMidleStr_Pos, 1)
			If StringIsUpper($iMidleStr) Then $iMidleStr_Chck = StringUpper($iMidleStr_Chck) ; актуально только для изменённого символа
		Else
			$iMidleStr_Chck = $iMidleStr
		EndIf

		$sRetStr &= $iMidleStr_Chck
	Next
	
	Return $sRetStr
EndFunc   ;==>_Encoding_UTF8BOMDecode


Поменять и всю UDF сохранить в ANSI.
Это нормально что для символа "ч" нет верхнего регистра?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AZJIO [?]
Это нормально что для символа "ч" нет верхнего регистра?
Даже и не знаю, особо не тестировал эту функцию.

Библиотеку позже обновлю.
 
Автор
CreatoR

CreatoR

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

[v1.5], 24.09.2012
* Кодировка библиотеки изменена обратно на ANSI, изменённая кодировка вызывала проблемы с утилитой проверки синтаксиса.
* _Encoding_HexSymbolsToANSI переименована в _Encoding_QuotedPrintableToANSI. _Encoding_HexSymbolsToANSI по прежнему поддерживается (устарела).
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Оказывается можно подругому конвертировать (источник)

Код:
$sString = "Привет"
$sOut = ''
$sOut &= '866 :' & @Tab & _WinAPI_WideCharToMultiByte ( $sString , 866) & @CRLF ; преобразование в 866
$sOut &= 'UTF8 :' & @Tab & _WinAPI_WideCharToMultiByte ( $sString , 65001) & @CRLF ; преобразование в UTF8
$sOut &= 'KOI8R :' & @Tab & _WinAPI_WideCharToMultiByte ( $sString , 20866) & @CRLF ; преобразование в KOI8R
$sOut &= 'KOI8U :' & @Tab & _WinAPI_WideCharToMultiByte ( $sString , 21866) & @CRLF ; преобразование в KOI8U
$sOut &= 'ISO-8859-5 :' & @Tab & _WinAPI_WideCharToMultiByte ( $sString , 28595) & @CRLF ; преобразование в ISO-8859-5
MsgBox(0, 'Сообщение', $sOut)

$sString = ''
$sString &= _WinAPI_MultiByteToWideChar ('ЏаЁўҐв' , 866, 0, True) & @CRLF ; 866
$sString &= _WinAPI_MultiByteToWideChar ('рТЙЧЕФ' , 20866 , 0, True) & @CRLF ; KOI8R
$sString &= _WinAPI_MultiByteToWideChar ('рТЙЧЕФ' , 21866 , 0, True) & @CRLF ; KOI8U
$sString &= _WinAPI_MultiByteToWideChar ('їаШТХв' , 28595 , 0, True) & @CRLF ; ISO-8859-5
$sString &= _WinAPI_MultiByteToWideChar ('Привет' , 65001, 0, True) & @CRLF ; UTF8
MsgBox(0, 'Сообщение', $sString)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Семёнычев Роман [?]
Может так:
Код:
ConsoleWrite(_Encoding_ANSIToOEM(_Encoding_UTF8ToANSI($sString)) & @LF)


AZJIO [?]
Оказывается можно подругому конвертировать
Нужно ещё проверить на корректность метода, а то я знаю что в API могут быть много сюрпризов.
 

Денис

Знающий
Сообщения
35
Репутация
8
В версии 1.5 функция _Encoding_Base64Encode() добавляет в конец строки какие то очень странные переводы строки которые не удаляются обычным StringStripCR(), поэтому приходится после обработки вычитать из строки последние два символа(вывел экспериментально).


Добавлено:
Сообщение автоматически объединено:

Я разобрался, эти странные переводы строки только на первый взгляд странные, на самом деле они вполне обычные. Интересная особенность в том что функция их вставляет через каждые 64 символа, или если строка короче, то в конец строки.

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

Код:
Return StringRegExpReplace(BinaryToString(DllStructGetData($a, 1)),'\r\n','')


Я не уверен на сколько это правильно с точки зрения стандартов, но для моей задачи эти символы объективно лишние. Стоит отметить, ранее в версии 1.0 этих символов не было, то есть можно предположить что этих символов там все таки не должно быть.
 
Верх