Что нового

[Данные, строки] Текстовый файл читается как бинарный

Alexey_A

Новичок
Сообщения
8
Репутация
0
Есть карточка контакта, выгруженная из телефона, которая представляет собой обычный текстовый файл. Файл отлично открывается всем: Far, Word, Notepad, TextPad, Notepad++, а при чтении в AutoIt получается неведомо что. FileRead воспринимает файл как бинарный (похоже).

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

Что помогает: если в FileOpen поставить флаг 16 (принудительное чтение в бинарном режиме), а потом выполнить BinaryToString, то удаётся получить нормальные данные, не удаляя этот символ.

Код, чтобы увидеть ерунду:

Код:
$fFile = FileOpen('sample.txt', 0)
$sFileData = FileRead($fFile)
FileClose($fFile)

MsgBox(0, 'File data', $sFileData)


Код, который позволяет увидеть нормальные данные:

Код:
$fFile = FileOpen('sample.txt', 16)
$sFileData = FileRead($fFile)
FileClose($fFile)

MsgBox(0, 'File data', BinaryToString($sFileData))


Файл прикладываю.

Вопросы:

1) Можно ли заставить AutoIt читать файл принудительно как текстовый (или игнорировать не-ASCII символы), как противоположность флагу 16, который включает принудительный бинарный режим?
2) Можете ли подсказать, что не так с этим последним символом, и почему он делает файл в представлении AutoIt не текстовым?
 

Вложения

  • sample.txt
    304 байт · Просмотры: 7

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Alexey_A [?]
Можно ли заставить AutoIt читать файл принудительно как текстовый
Код:
#include <Encoding.au3>
$fFile = FileOpen('sample.txt', 0)
$sFileData = FileRead($fFile)
FileClose($fFile)

MsgBox(0, 'File data', _Encoding_ISO88591To1251($sFileData))
 
Автор
Alexey_A

Alexey_A

Новичок
Сообщения
8
Репутация
0
Garrett сказал(а):
Код:
MsgBox(0, 'File data', _Encoding_ISO88591To1251($sFileData))

Я пробовал это. Портится текст (BGNVAD вместо BEGIN и т.д.):

Код:
BGNVAD
ESO:.
NCASTUF8ECDN=UTDPITBE=09=0B=0B=18=0B=0B=0B=18=0B=0B;;
F;HRE=T-;NOIGQOE-RNAL:D=0D=BD=5D=AD=1D=0D=DD=4D=0D=ED=2
E;RFHM;EL805449
-RCLI:
EDVAD
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Alexey_A [?]
К сожалению, портится. :(
Вот рабочий вариант.
Код:
$fFile = FileOpen('sample.txt', 0)
$sFileData = FileRead($fFile)
FileClose($fFile)
;~ ConsoleWrite(StringFormat("%s\n", _MultiByteToWideChar($sFileData)))
MsgBox(0, 'File data', _MultiByteToWideChar($sFileData))


Func _MultiByteToWideChar($s_Text, $i_CodePage = 0, $i_Flags = 0)

	$i_Size = DllCall("kernel32.dll", "int", "MultiByteToWideChar", _
									  "uint", $i_CodePage, "dword", $i_Flags, "wstr", $s_Text, _
									  "int", -1, "ptr", 0, "int", 0)[0]
	If @error Then _
		Return SetError(@error, 0, 0)

	$p_OutText = DllStructCreate("wchar[" & $i_Size & "]")

	DllCall("kernel32.dll", "int", "MultiByteToWideChar", _
							"uint", $i_CodePage, "dword", $i_Flags, "wstr", $s_Text, _
							"int", -1, "ptr", DllStructGetPtr($p_OutText), "int", $i_Size)
	If @error Then _
		Return SetError(@error, 0, 0)

	Return DllStructGetData($p_OutText, 1)
	; https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd319072(v=vs.85).aspx
EndFunc ;==>_MultiByteToWideChar
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Alexey_A
Код:
$fFile = FileOpen('sample.txt', 512)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
InnI :ok:
OffTopic:
Пошел я перечитывать справку :laugh:
 
Автор
Alexey_A

Alexey_A

Новичок
Сообщения
8
Репутация
0
Спасибо большое!

Garrett, спасибо за уделённое время и этот код!

InnI, спасибо! В русской справке всё заканчивается флагом 256: http://autoit-script.ru/autoit3_docs/functions/FileOpen.htm а в английскую я не догадался заглянуть.

С 512-ю работает чудесно!
 
Верх