PDA

Показать полную графическую версию : [решено] Функция _Encoding_GetCyrillicANSIEncoding


Паразит
14-04-2017, 09:43
Почему у меня не получается правильно определить кодировку файла с помощью функции _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
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <Encoding.au3>

$bUTF8 = False (http://www.autoitscript.com/autoit3/docs/keywords.htm#False) ;True
$sString = 'тест'
$sFile = @TempDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@tempdir) & '\test.txt'

$hFile = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile, 2 + ($bUTF8 ? 128 : 0))
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hFile, ($bUTF8 ? _Encoding_StringToUTF8($sString) : $sString))
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile)

$sRead = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($sFile, 256)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) _Encoding_IsUTF8Format($sRead) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0, @ScriptName (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptname), 'UTF-8')
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0, @ScriptName (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptname), _Encoding_GetCyrillicANSIEncoding($sRead))
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

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

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

Iska
14-04-2017, 16:15
И вообще, существует ли безошибочный способ для такой задачи? »
Нет, не существует. Однозначно определить кодировку можно только для юникода при наличии BOM. Во всех остальных случаях приходится так или иначе гадать на кофейной гуще, пытаясь использовать частотные характеристики появления определённых символов. Говоря математическим языком — задача не имеет аналитического решения, но частично может быть решена посредством численных методов.

Creat0R
15-04-2017, 01:38
Вот у меня файл »
Можно его увидеть?

Паразит
15-04-2017, 02:55
Ну вот, я там сделал несколько файлов. Сохранил их в разных блокнотах, и с разными кодировками.

145009

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

Паразит
15-04-2017, 07:55
Iska, я уже и не помню.
Iska, Creat0R, короче задача снимается. Решил отказаться от этого дела. Спасибо Вам.

Creat0R
15-04-2017, 12:34
Паразит,
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <Encoding.au3>

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 5
$sFile = @DesktopDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@desktopdir) & '\1\' & $i & '.txt'
$sEncoding = _Encoding_GetFileEncodingString($sFile)
ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)('[' & $sFile & '] encoding: ' & $sEncoding & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf))
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _Encoding_GetFileEncodingString($sFile)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iEncoding = FileGetEncoding (http://www.autoitscript.com/autoit3/docs/functions/FileGetEncoding.htm)($sFile)

Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) $iEncoding
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 0
$iEncoding = _Encoding_GetCyrillicANSIEncoding(FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($sFile, 256))
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 32
$iEncoding = 'UTF16 Little Endian'
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 64
$iEncoding = 'UTF16 Big Endian'
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 128
$iEncoding = 'UTF8 (with BOM)'
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 256
$iEncoding = 'UTF8 (without BOM)'
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $iEncoding
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

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

Creat0R
16-04-2017, 10:20
Вы не определились с содержимым »
Нет, а мне оно надо? ))

Iska
16-04-2017, 13:36
Дык, интересно же ж, как и чем такое удалось провернуть :).

Creat0R
18-04-2017, 01:32
как и чем такое удалось провернуть »
Notepad2 умеет так сохранять, думаю и Notepad++ тоже.

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

Creat0R
18-04-2017, 13:31
Вы именно эти файлы (1.txt и 5.txt) — видели, пробовали открывать их хоть в Блокноте, хоть в Notepad2, хоть в Notepad++, хоть в чём ещё? »
Да в Notepad2 открывается.
У меня не вышло »
Что именно? файл не открывается?

Iska
19-04-2017, 02:27
Да в Notepad2 открывается. »
Давайте сравним. Покажите, как выглядят у Вас в нём эти файлы.

У меня так:
http://i.imgur.com/0LzF38K.png

Creat0R
20-04-2017, 02:00
У меня также.

Iska
20-04-2017, 02:52
У меня также. »
Спасибо, ясно. Тогда вопрос снимается: пусть коллега Паразит вспоминает и сам разбирается, как ему удалось этакое чудо :).




© OSzone.net 2001-2012