Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Функция _Encoding_GetCyrillicANSIEncoding

Ответить
Настройки темы
[решено] Функция _Encoding_GetCyrillicANSIEncoding

Аватара для Паразит

Пользователь


Сообщения: 68
Благодарности: 0

Профиль | Отправить PM | Цитировать


Почему у меня не получается правильно определить кодировку файла с помощью функции _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, вообщем, любые кириллические кодировки.

Отправлено: 09:43, 14-04-2017

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
#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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:30, 14-04-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Паразит

Пользователь


Сообщения: 68
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 14:10, 14-04-2017 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:15, 14-04-2017 | #4


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата Паразит:
Вот у меня файл »
Можно его увидеть?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:38, 15-04-2017 | #5


Аватара для Паразит

Пользователь


Сообщения: 68
Благодарности: 0

Профиль | Отправить PM | Цитировать



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

1.zip

Отправлено: 02:55, 15-04-2017 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 03:56, 15-04-2017 | #7


Аватара для Паразит

Пользователь


Сообщения: 68
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 07:55, 15-04-2017 | #8


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Паразит,
Код: Выделить весь код
#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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:34, 15-04-2017 | #9


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:56, 15-04-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Функция _Encoding_GetCyrillicANSIEncoding

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Функция _Encoding_URIDecode Паразит AutoIt 6 14-04-2017 13:49
C/C++ - Функция pashazt Программирование и базы данных 3 23-12-2012 01:35
Функция ClearType destrier Microsoft Windows 2000/XP 2 18-11-2006 21:11
функция в Visual C++ Listo Программирование и базы данных 2 04-05-2006 20:50
Массив и функция Scorpion666 Вебмастеру 4 02-03-2006 12:44




 
Переход