Автор Тема: Encoding UDF - Библиотека для работы с кодировками строк  (Прочитано 126899 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Latoid [?]

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

Русское сообщество AutoIt

Re: Encoding UDF - Библиотека для работы с кодировками строк
« Ответ #90 Отправлен: Сентябрь 15, 2016, 12:57:25 »

Оффлайн koros [?]

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

Оффлайн Latoid [?]

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


Добавлено: Сентябрь 15, 2016, 13:57:24
Дайте пример двух строк в разных кодировках
« Последнее редактирование: Сентябрь 15, 2016, 13:57:24 от Latoid, Причина: Объединение сообщений »

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Посмотрите эту тему https://www.autoitscript.com/forum/topic/183164-forceutf8-forcedly-convert-strings-to-utf-8-without-knowing-its-original-encoding/, там автор говорит, что может автоматически в UTF8 не зная исходную.

Русское сообщество AutoIt

Re: Encoding UDF - Библиотека для работы с кодировками строк
« Ответ #93 Отправлен: Сентябрь 15, 2016, 14:55:04 »

Оффлайн koros [?]

  • Новичок
  • *
  • Сообщений: 31
  • Репутация: 1
    • Награды
  • Версия AutoIt: 3.3.x.x
koros
Насколько я знаю, не привязываясь к языку, невозможно.


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

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


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Оффлайн Latoid [?]

  • Новичок
  • *
  • Сообщений: 95
  • Репутация: 11
    • Награды
koros

Потестируйте это. Я проверил только на русском языке.
Код: AutoIt [Выделить]
#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 [?]

  • Новичок
  • *
  • Сообщений: 31
  • Репутация: 1
    • Награды
  • Версия AutoIt: 3.3.x.x
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 буквами из других алфавитов  это, понятно, не сработает.


Русское сообщество AutoIt

Re: Encoding UDF - Библиотека для работы с кодировками строк
« Ответ #97 Отправлен: Сентябрь 16, 2016, 12:42:53 »

Оффлайн koros [?]

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

Оффлайн koros [?]

  • Новичок
  • *
  • Сообщений: 31
  • Репутация: 1
    • Награды
  • Версия AutoIt: 3.3.x.x
... Достаточно ли такой строки?
Посмотрите как задается значение переменной $sProgUnzip в моем скрипте.
И что там про то, как определить Unicode?

Оффлайн Kirilopak [?]

  • FrancisRahVX
  • Новичок
  • *
  • Сообщений: 2
  • Репутация: 0
  • Пол: Мужской
    • Вы мне не подскажете, где мне узнать больше об этом?
    • Награды
  • Версия AutoIt: 3.3.14.0
НАСТРОЕНИЕ ПРОСТО ПОДРЫВАЕ В ПРЯМОМ СМЫСЛЕ СЛОВА
ссылка:http://www.kiddishop.com.ua/Reabilitacionnye-trenazhery [nonactive]

Русское сообщество AutoIt

Re: Encoding UDF - Библиотека для работы с кодировками строк
« Ответ #100 Отправлен: Сентябрь 01, 2018, 03:21:14 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
82 Ответов
90382 Просмотров
Последний ответ Июль 04, 2018, 14:08:25
от alex33
90 Ответов
47209 Просмотров
Последний ответ Август 01, 2014, 12:28:58
от k790
25 Ответов
31620 Просмотров
Последний ответ Январь 18, 2016, 02:21:12
от yrus
6 Ответов
8372 Просмотров
Последний ответ Июль 12, 2012, 23:54:46
от Afonichev
5 Ответов
13779 Просмотров
Последний ответ Сентябрь 01, 2018, 03:05:24
от o.karpovych1982
0 Ответов
7358 Просмотров
Последний ответ Март 18, 2010, 14:57:53
от Yashied
140 Ответов
68211 Просмотров
Последний ответ Апрель 19, 2015, 02:43:50
от Broadcastic
2 Ответов
2665 Просмотров
Последний ответ Август 22, 2013, 16:19:28
от sngr
0 Ответов
633 Просмотров
Последний ответ Ноябрь 25, 2017, 23:53:10
от the_gt99
2 Ответов
243 Просмотров
Последний ответ Апрель 24, 2018, 08:14:39
от ra4o