Показать полную графическую версию : [решено] Функция _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, вообщем, любые кириллические кодировки.
#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)
Неправильно возвращает кодировку.
Вот у меня файл UTF-16 LE, а он мне показывает WINDOWS-1251.
Функция не может определять UTF-16 кодировки.
И вообще, существует ли безошибочный способ для такой задачи? »
Нет, не существует. Однозначно определить кодировку можно только для юникода при наличии BOM. Во всех остальных случаях приходится так или иначе гадать на кофейной гуще, пытаясь использовать частотные характеристики появления определённых символов. Говоря математическим языком — задача не имеет аналитического решения, но частично может быть решена посредством численных методов.
Вот у меня файл »
Можно его увидеть?
Ну вот, я там сделал несколько файлов. Сохранил их в разных блокнотах, и с разными кодировками.
145009
Не могли бы Вы ещё указать, какими блокнотами и в какие кодировки Вы сохраняли 1.txt и 5.txt? Ибо там нечто не вполне вразумительное наблюдается. Кодировка вроде как явно указана BOM'ом как UTF-16BE, но дальше…
Iska, я уже и не помню.
Iska, Creat0R, короче задача снимается. Решил отказаться от этого дела. Спасибо Вам.
Паразит,
#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)
Creat0R, а Вы не определились с содержимым (не кодировкой) файлов 1.txt и 5.txt из приложенного коллегой Паразит архива?
Вы не определились с содержимым »
Нет, а мне оно надо? ))
Дык, интересно же ж, как и чем такое удалось провернуть :).
как и чем такое удалось провернуть »
Notepad2 умеет так сохранять, думаю и Notepad++ тоже.
Creat0R, Вы именно эти файлы (1.txt и 5.txt) — видели, пробовали открывать их хоть в Блокноте, хоть в Notepad2, хоть в Notepad++, хоть в чём ещё? У меня не вышло, отчего и задаю вопросы.
Вы именно эти файлы (1.txt и 5.txt) — видели, пробовали открывать их хоть в Блокноте, хоть в Notepad2, хоть в Notepad++, хоть в чём ещё? »
Да в Notepad2 открывается.
У меня не вышло »
Что именно? файл не открывается?
Да в Notepad2 открывается. »
Давайте сравним. Покажите, как выглядят у Вас в нём эти файлы.
У меня так:
http://i.imgur.com/0LzF38K.png
У меня также. »
Спасибо, ясно. Тогда вопрос снимается: пусть коллега Паразит вспоминает и сам разбирается, как ему удалось этакое чудо :).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC