Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Функция _Encoding_GetCyrillicANSIEncoding (http://forum.oszone.net/showthread.php?t=325935)

Паразит 14-04-2017 09:43 2729168

Функция _Encoding_GetCyrillicANSIEncoding
 
Почему у меня не получается правильно определить кодировку файла с помощью функции _Encoding_GetCyrillicANSIEncoding?

Код:

Func _Encoding_GetCyrillicANSIEncoding($sString)
        Local $iCode, $iWIN = 0, $iDOS = 0, $iKOI = 0, $iISO = 0
        Local $VarString = StringSplit($sString, "")
        For $i = 1 To $VarString[0]
                $iCode = Asc($VarString[$i])
                Select
                        Case $iCode = 192 Or $iCode = 224 Or $iCode = 200 Or $iCode = 232 Or $iCode = 206 Or $iCode = 238 Or $iCode = 210 Or $iCode = 242
                                $iWIN += 1
                        Case $iCode = 128 Or $iCode = 160 Or $iCode = 136 Or $iCode = 168 Or $iCode = 142 Or $iCode = 174 Or $iCode = 146
                                $iDOS += 1
                        Case $iCode = 225 Or $iCode = 193 Or $iCode = 233 Or $iCode = 201 Or $iCode = 239 Or $iCode = 207 Or $iCode = 244 Or $iCode = 212
                                $iKOI += 1
                        Case $iCode = 176 Or $iCode = 208 Or $iCode = 184 Or $iCode = 216 Or $iCode = 190 Or $iCode = 222 Or $iCode = 194
                                $iISO += 1
                        Case $iCode = 226
                                $iDOS += 1
                                $iISO += 1
                EndSelect
        Next
        If $iKOI >= $iWIN And $iKOI > $iDOS And $iKOI > $iISO Then
                Return "KOI8-R"
        ElseIf $iWIN > $iKOI And $iWIN > $iDOS And $iWIN > $iISO Then
                Return "WINDOWS-1251"
        ElseIf $iDOS > $iKOI And $iDOS > $iWIN And $iDOS > $iISO Then
                Return "IBM-866"
        ElseIf $iISO > $iWIN And $iISO > $iDOS And $iISO > $iKOI Then
                Return "ISO-8859-5"
        Else
                Return False
        EndIf
EndFunc

При любой кодировке файла, она возвращает False.
И вообще, существует ли безошибочный способ для такой задачи?
_Encoding_GetFileEncoding не считается. Она работает, но она ограничена только ANSI, UTF-8, UTF-16 и UTF-32.
Хотелось бы, чтобы определялись те же OEM-866, KOI8, вообщем, любые кириллические кодировки.

Creat0R 14-04-2017 13:30 2729223

Код:

#include <Encoding.au3>

$bUTF8 = False ;True
$sString = 'тест'
$sFile = @TempDir & '\test.txt'

$hFile = FileOpen($sFile, 2 + ($bUTF8 ? 128 : 0))
FileWrite($hFile, ($bUTF8 ? _Encoding_StringToUTF8($sString) : $sString))
FileClose($hFile)

$sRead = FileRead($sFile, 256)

If _Encoding_IsUTF8Format($sRead) Then
    MsgBox(0, @ScriptName, 'UTF-8')
Else
    MsgBox(0, @ScriptName, _Encoding_GetCyrillicANSIEncoding($sRead))
EndIf


Паразит 14-04-2017 14:10 2729238

Неправильно возвращает кодировку.
Вот у меня файл UTF-16 LE, а он мне показывает WINDOWS-1251.

Функция не может определять UTF-16 кодировки.

Iska 14-04-2017 16:15 2729271

Цитата:

Цитата Паразит
И вообще, существует ли безошибочный способ для такой задачи? »

Нет, не существует. Однозначно определить кодировку можно только для юникода при наличии BOM. Во всех остальных случаях приходится так или иначе гадать на кофейной гуще, пытаясь использовать частотные характеристики появления определённых символов. Говоря математическим языком — задача не имеет аналитического решения, но частично может быть решена посредством численных методов.

Creat0R 15-04-2017 01:38 2729429

Цитата:

Цитата Паразит
Вот у меня файл »

Можно его увидеть?

Паразит 15-04-2017 02:55 2729434

Вложений: 1
Ну вот, я там сделал несколько файлов. Сохранил их в разных блокнотах, и с разными кодировками.

Файл 145009

Iska 15-04-2017 03:56 2729443

Не могли бы Вы ещё указать, какими блокнотами и в какие кодировки Вы сохраняли 1.txt и 5.txt? Ибо там нечто не вполне вразумительное наблюдается. Кодировка вроде как явно указана BOM'ом как UTF-16BE, но дальше…

Паразит 15-04-2017 07:55 2729452

Iska, я уже и не помню.
Iska, Creat0R, короче задача снимается. Решил отказаться от этого дела. Спасибо Вам.

Creat0R 15-04-2017 12:34 2729513

Паразит,
Код:

#include <Encoding.au3>

For $i = 1 To 5
    $sFile = @DesktopDir & '\1\' & $i & '.txt'
    $sEncoding = _Encoding_GetFileEncodingString($sFile)
    ConsoleWrite('[' & $sFile & '] encoding: ' & $sEncoding & @CRLF)
Next

Func _Encoding_GetFileEncodingString($sFile)
    Local $iEncoding = FileGetEncoding($sFile)

    Switch $iEncoding
        Case 0
            $iEncoding = _Encoding_GetCyrillicANSIEncoding(FileRead($sFile, 256))
        Case 32
            $iEncoding = 'UTF16 Little Endian'
        Case 64
            $iEncoding = 'UTF16 Big Endian'
        Case 128
            $iEncoding = 'UTF8 (with BOM)'
        Case 256
            $iEncoding = 'UTF8 (without BOM)'
    EndSwitch

    Return $iEncoding
EndFunc


Iska 15-04-2017 15:56 2729571

Creat0R, а Вы не определились с содержимым (не кодировкой) файлов 1.txt и 5.txt из приложенного коллегой Паразит архива?

Creat0R 16-04-2017 10:20 2729735

Цитата:

Цитата Iska
Вы не определились с содержимым »

Нет, а мне оно надо? ))

Iska 16-04-2017 13:36 2729773

Дык, интересно же ж, как и чем такое удалось провернуть :).

Creat0R 18-04-2017 01:32 2730223

Цитата:

Цитата Iska
как и чем такое удалось провернуть »

Notepad2 умеет так сохранять, думаю и Notepad++ тоже.

Iska 18-04-2017 05:19 2730232

Creat0R, Вы именно эти файлы (1.txt и 5.txt) — видели, пробовали открывать их хоть в Блокноте, хоть в Notepad2, хоть в Notepad++, хоть в чём ещё? У меня не вышло, отчего и задаю вопросы.

Creat0R 18-04-2017 13:31 2730328

Цитата:

Цитата Iska
Вы именно эти файлы (1.txt и 5.txt) — видели, пробовали открывать их хоть в Блокноте, хоть в Notepad2, хоть в Notepad++, хоть в чём ещё? »

Да в Notepad2 открывается.
Цитата:

Цитата Iska
У меня не вышло »

Что именно? файл не открывается?

Iska 19-04-2017 02:27 2730583

Цитата:

Цитата Creat0R
Да в Notepad2 открывается. »

Давайте сравним. Покажите, как выглядят у Вас в нём эти файлы.

У меня так:
Скрытый текст

Creat0R 20-04-2017 02:00 2730841

У меня также.

Iska 20-04-2017 02:52 2730846

Цитата:

Цитата Creat0R
У меня также. »

Спасибо, ясно. Тогда вопрос снимается: пусть коллега Паразит вспоминает и сам разбирается, как ему удалось этакое чудо :).


Время: 10:08.

Время: 10:08.
© OSzone.net 2001-