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

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

Оффлайн Latoid [?]

  • Новичок
  • *
  • Сообщений: 89
  • Репутация: 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 [?]

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


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

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1966
  • Репутация: 432
  • Пол: Мужской
    • Награды
  • Версия 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 [?]

  • Новичок
  • *
  • Сообщений: 89
  • Репутация: 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 [?]

  • Новичок
  • *
  • Сообщений: 89
  • Репутация: 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?

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

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

 

Похожие темы

  Тема / Автор Ответов Последний ответ
76 Ответов
70098 Просмотров
Последний ответ Август 09, 2016, 23:47:20
от BL_PENETRATOR
90 Ответов
39125 Просмотров
Последний ответ Август 01, 2014, 12:28:58
от k790
25 Ответов
26990 Просмотров
Последний ответ Январь 18, 2016, 02:21:12
от yrus
19 Ответов
14177 Просмотров
Последний ответ Февраль 05, 2010, 10:06:16
от Yashied
6 Ответов
7115 Просмотров
Последний ответ Июль 12, 2012, 23:54:46
от Viktor1703
3 Ответов
11641 Просмотров
Последний ответ Июнь 14, 2015, 18:48:07
от madmasles
0 Ответов
6602 Просмотров
Последний ответ Март 18, 2010, 14:57:53
от Yashied
140 Ответов
55340 Просмотров
Последний ответ Апрель 19, 2015, 02:43:50
от Broadcastic
1 Ответов
5436 Просмотров
Последний ответ Апрель 15, 2013, 01:04:36
от Kaster
2 Ответов
1930 Просмотров
Последний ответ Август 22, 2013, 16:19:28
от sngr