Что нового

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

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
В функции _Encoding_GetCyrillicANSIEncoding переделать Select на Switch. Хотя не только в ней.
 
Автор
CreatoR

CreatoR

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

[v1.6], 15.03.2016
+ Добавлены заголовки к функциям с детальной документацией.
+ Добавлена функция _Encoding_RemoteEncode (удалённое конвертирование используя php).
* Оптимизация кода.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
CreatoR, как вам примерно такой вариант? :IL_AutoIt_1: :ok: 8) :D ;D :smile:
1php_to_au3.zip (3157.59 kb) посмотрите...
Локальное выполнение PHP и без всяких серверов, сайтов и т.д.
 
Автор
CreatoR

CreatoR

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

[v1.7], 19.03.2016
* _Encoding_RemoteEncode переименована в _Encoding_PhpEncode, т.к теперь она использует небольшой локальный php сервер.
- Убран параметр $bUnicode из функции _Encoding_PhpEncode.
 

Ciber SLasH

Новичок
Сообщения
13
Репутация
0
_Encoding_IsUTF8Format - отрабатывает неправильно
Код:
#include <Encoding.au3>

$sData = FileRead(@WindowsDir&'\win.ini')
$ret = _Encoding_IsUTF8Format($sData)
If $ret Then
	ConsoleWrite('UTF-8')
Else
	ConsoleWrite('other')
EndIf

PS: если написать BB-код "code=autoit", то форум ругается "Извините, вам запрещено оставлять внешние ссылки." и не даёт отправить сообщение.
PS2: в общем нужен код, которые сможет определить, является ли содержимое файла в кодировки UTF-8/Unicode или кодировка ANSI.


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

Нашёл:
Код:
#include <Encoding.au3>

$ret = _Encoding_GetFileEncoding(@WindowsDir&'\win.ini')
If $ret = 2 Then
	ConsoleWrite('UTF-8')
Else
	ConsoleWrite('other')
EndIf
:smile:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
:

Ciber SLasH сказал(а):
PS: если написать BB-код "code=autoit", то форум ругается "Извините, вам запрещено оставлять внешние ссылки." и не даёт отправить сообщение.
А если написать autoit ?
[autoit]; так точно должно работать[/autoit]
Код:
; так точно должно работать

 

koros

Новичок
Сообщения
32
Репутация
1
Насколько я понял _Encoding_StringToUTF8 должна конвертировать строку в UTF8. Но если в строке OEM (866) символы, то не работает. Можно ли сконвертировать в UTF8 строку, в которой встречаются и OEM (866) и ANSI?. Или хотя бы сделать функцию определения кодировки строки (я могу разбить строку на подстроки, в которых будет однозначно одна кодировка, но неизвестно заранее какая кодировка в какой строке)?
 

Latoid

Знающий
Сообщения
95
Репутация
11
koros
_Encoding_GetCyrillicANSIEncoding ()
_Encoding_CyrillicTo1251()
 

Latoid

Знающий
Сообщения
95
Репутация
11
koros
А вот такого, похоже, здесь не написал никто. Русскоязычным этого не нужно. Можно поискать на форумах программистов, чей родной язык требуемый.
Можно самому написать, если достаточно приемлемым уровнем необходимого языка владеете. Логику я расскажу.
 

koros

Новичок
Сообщения
32
Репутация
1
Latoid
В том то и дело, что язык предполагается любой.
Неужели нет возможности определить в какой кодировки строка - OEM (866) или ANSI?
 

Latoid

Знающий
Сообщения
95
Репутация
11
koros
Насколько я знаю, не привязываясь к языку, невозможно.


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

Дайте пример двух строк в разных кодировках
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Посмотрите эту тему https://www.autoitscript.com/forum/topic/183164-forceutf8-forcedly-convert-strings-to-utf-8-without-knowing-its-original-encoding/, там автор говорит, что может автоматически в UTF8 не зная исходную.
 

koros

Новичок
Сообщения
32
Репутация
1
Latoid сказал(а):
koros
Насколько я знаю, не привязываясь к языку, невозможно.


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

Дайте пример двух строк в разных кодировках



Пример: Берем unzip и mtee (dj вложении и запускаем следующим образом:
Код:
unzip -l path\file 2>&1 | mtee.exe c:\1.txt
path - путь, который содержит кириллические символы или символы из других языков.
file - любой файл, не являющийся zip-архивом
В c:\1.txt (во вложении) получаем смесь из OEM и ANSI. Я хотел бы считать этот файл и привести к UTF

inververs
Спасибо но не работает. Похоже это только для
Latin1 (ISO-8859-1), Windows-1252 OR UTF-8
 

Вложения

  • 1.txt
    630 байт · Просмотры: 13
  • bin.rar
    97.3 КБ · Просмотры: 7

Latoid

Знающий
Сообщения
95
Репутация
11
koros

Потестируйте это. Я проверил только на русском языке.
Код:
#include <Encoding.au3>
$FileName = @ScriptDir & "\1.txt"
$sPath = "G:/XP/MyInstallers/7z/UniExtract/"

$sFile = FileRead ($FileName)
$aTMP0 = StringRegExp ($sFile, "(?sU).*" & $sPath & "(.*)/", 3)

For $i = 0 to UBound ($aTMP0) -1
	$sCodePage = _OEMOrANSI ($aTMP0[$i])
	ConsoleWrite ($sCodePage & @CRLF)
Next

Func _OEMOrANSI ($sSrc1)
	$sSrc2 = _Encoding_OEM2ANSI ($sSrc1)
	$sSrc3 = _Encoding_ANSIToOEM ($sSrc2)
	If $sSrc1 = $sSrc3 Then
		Return "OEM"
	Else
		Return "ANSI"
	EndIf
EndFunc ; _OEMOrANSI
 

koros

Новичок
Сообщения
32
Репутация
1
Latoid
Большое спасибо - работает. Но только для русского языка. Для остальных, видимо, надо не OEM2ANSI, а OEM2UNICODE....
Нет ли такого?

Alofa
Предложенное вами - не выход, т.к.
1. Я не всегда могу использовать $STDERR_CHILD и $STDOUT_CHILD
2. В STDERR и STDOUT также попадают строки в различных кодировках.
 

Latoid

Знающий
Сообщения
95
Репутация
11
koros
Существующие алгоритмы распознания всегда привязаны к конкретному языку. Это или подсчет кол-ва популярных в языке букв, имеющих разные коды в разных кодировках, или проверка недопустимых в языке сочетаний букв по словарю, или что-то еще, но это всегда привязка к конкретному языку. Алгоритмы эти не определяют однозначно кодировку, а скорее угадывают ее с той или иной степенью вероятности.

По-иному сделать невозможно, просто исходя из природы однобайтных кодировок. Текст - просто набор байт (одна буква - один байт), и нигде нет никакого указания какой кодовой таблицей эти байты надо расшифровывать (какую букву надо поставить заместо этого байта).

Существовал бы такой алгоритм в природе - давно бы написали, и проблема была бы решена. Юникод не от нечего делать придумали, как альтернативу однобайтным кодировкам.

Так что код мой выше может работать только с русскими символами. Смените локаль Windows на, скажем, греческую - станет с ними норм работать, а с русскими перестанет. Потому как нет кодировки "ОЕМ" или "ANSI". Есть семейство таких кодировок. Для русского OEM866 и ANSI1251, для греческого ОЕМ737 и ANSI1253; и т.д.

И если функция _Encoding_OEM2ANSI выполняется в русской Windows, она переводит строку именно из OEM866 в ANSI1251. C буквами из других алфавитов это, понятно, не сработает.
 

koros

Новичок
Сообщения
32
Репутация
1
Latoid
Большое спасибо за разъяснение. Для моих нужд видимо проще копировать и переименовывать файл в папку, путь к которой не содержит юникодных символов. В одном скрипте увидел следующую строку
Код:
(?i)(?m)^[\w\Q @!§$%&/\()=?,.-:+~'Іі{[]}*#Я°^влцдьокфыпбйнуъаимтщ\E]+$
для использования в StringRegExp() для определения путей\имен с юникодными символами. Достаточно ли такой строки?
 
Верх