Что нового

Определить кодировку текстового файла и перекодировать в 1251

gora

Знающий
Сообщения
315
Репутация
19
Имеются два текстовых файла (во вложении).
Требуется определить их исходную кодировку и перекодировать оба файла в кириллица Windows (1251) средствами AutoIt. Воспользоваться этим не получилось.
 

beve

Осваивающий
Сообщения
104
Репутация
30
OffTopic:
А как китайский в файле wrar40b4_config.txt перевисти в кирилицу? Или это просто шутка была?
P.S. Извиняюсь, напервый раз казалось что то китайский..., а оказывается там несколько раз перекодировалось, думаю autoit c этим не справиться, в таких сложных случаях только программа штирлиц или аналогичная поможет, возможно в них есть возможность обработки из консоли..., как вариант.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Код:
$str = FileRead('wrar40b4ru_config.txt')
$file = FileOpen('wrar40b4ru_config_1251.txt', 2)
FileWrite($file, $str)
FileClose($file)

$str = FileRead('wrar40b4_config.txt')
$str = BinaryToString(StringToBinary($str, 2))
$file = FileOpen('wrar40b4_config_1251.txt', 2)
FileWrite($file, $str)
FileClose($file)
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
asdf8
Все замечательно, за исключением одного, как "Определить кодировку текстового файла..." ? Как различить файлы для принятия решения о способе их обработки (перекодировки) ?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Как различить файлы для принятия решения о способе их обработки
В данном случае - читать BOM (первые 2-3 байта файла):

Код:
UTF8                     0xEFBBBF
UTF16 Little Endian      0xFFFE
UTF16 Big Endian         0xFEFF
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
asdf8 [?]
читать BOM (первые 2-3 байта файла):
Беда в том, что оба файла имеют одинаковые BOM - 0xFFFE и по этому параметру различить их не удается. :(
Других вариантов нет?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
оба файла имеют одинаковые BOM - 0xFFFE
точно, и еще файл в кодировке ANSI имеет символы Chr(0) - этого тоже быть не должно.
Все равно функция _Encoding_GetFileEncoding из UDF Encoding правильно определяет один файл как ANSI, а другой, как UTF-16. Остается по BOM = 0xFFFE узнать, что его надо декодировать как UTF16 Little Endian
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
asdf8 [?]
Все равно функция _Encoding_GetFileEncoding из UDF Encoding правильно определяет один файл как ANSI, а другой, как UTF-16.
У меня не определяет! В обоих случаях пишет 2 :(
Код:
#include <Encoding.au3>
$Type1=_Encoding_GetFileEncoding("wrar40b4_config.txt")
$Type2=_Encoding_GetFileEncoding("wrar40b4ru_config.txt")
$preskey = MsgBox(1+256, "Test", _
"$Type1 = " & $Type1 & @CRLF & _
"$Type2 = " & $Type2 & @CRLF & _
@CRLF)
If $preskey = 2 Then Exit


Где я ошибаюсь?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
У меня не определяет!
Прошу прощения, я перед этим удалил BOM у ANSI файла :smile:
Видимо автоматом у того файла кодировку не определить - неправильный BOM + символы Chr(0) недадут
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
А про
Код:
FileGetEncoding()

кто то слышал? :whistle:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
CreatoR
FileGetEncoding() у обоих файлов возвращает 32. :(

gora
Я не знаю правильно это или нет, но так у меня работает:
Код:
Dim $aFiles[2] = ['wrar40b4_config.txt', 'wrar40b4ru_config.txt']

For $i = 0 To 1
	$hFile = FileOpen(@ScriptDir & '\' & $aFiles[$i], 16)
	$sText = FileRead($hFile, 10)
	FileClose($hFile)
	Switch StringInStr($sText, 57)
		;57 - буква W
		Case 11
			$sString = FileRead(@ScriptDir & '\' & $aFiles[$i])
			$sString = BinaryToString(StringToBinary($sString, 2))
			$hFile = FileOpen(@ScriptDir & '\1251_' & $aFiles[$i], 2)
			FileWrite($hFile, $sString)
			FileClose($hFile)
		Case 15
			$sString = FileRead(@ScriptDir & '\' & $aFiles[$i])
			$hFile = FileOpen(@ScriptDir & '\1251_' & $aFiles[$i], 2)
			FileWrite($hFile, $sString)
			FileClose($hFile)
	EndSwitch
Next
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
madmasles
Спасибо.
Привязываться к конкретной букве нельзя, т.к., текст может быть и другим, файлы приведены как образцы.
Нечто подобное мне тоже удалось сваять и без привязки:
Код:
_Encoding('wrar40b4ru_config')
_Encoding('wrar40b4_config')
exit

Func _Encoding($tf)
$file = FileOpen($tf & '.txt', 16)
$sRead = FileRead($file, 4)
FileClose($file)
	
$nByte12 = BinaryMid($sRead, 1, 2)
$nByte4 = BinaryMid($sRead, 4, 1)

$file = FileOpen($tf & '.txt', 0)
$str = FileRead($file)
FileClose($file)

If $nByte12 = '0xFFFE' Then
	If $nByte4 <> '0x00' Then $str = BinaryToString(StringToBinary($str, 2))
	$file = FileOpen($tf & '_1251.txt', 2)
	FileWrite($file, $str)
	FileClose($file)
EndIf
EndFunc   ;==>_Encoding

Но остается проблема в последних четырех байтах (0D 00 0A 00) в файле wrar40b4_config_1251.txt. Вот от этих двух лишних нулевых байт мне избавится не удалось. :( К сожалению и с Вашим вариантом та же беда.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
gora [?]
Но остается проблема в последних четырех байтах (0D 00 0A 00)
А если так:
Код:
;...
$sString = StringTrimRight(StringReplace($sString, @CRLF & Chr(26), ''), 4) & @CRLF
;...

@CRLF & Chr(26) этот квадрат:
 
Верх