Что нового

[Данные, строки] Замена символа Chr(0) в файле с кодировкой 866 на символ Chr(032) ( пробел)

Twilight_Wolf

Новичок
Сообщения
16
Репутация
0
Здравствуйте! Столкнулся с трудностями по редактированию досовского файла средствами Autoit.
Задача: открыть текстовый файлик, найти в нем все символы Chr(0) и заменить их на пробелы с последующим сохранением файла в той же кодировке.

Пробовал так:
Код:
#include <array.au3>
#include <Encoding.au3>
#include "WinAPIEx.au3"

$File = FileOpen("fprint.txt", 16)
dim $msg, $t
While 1
    $t = FileRead($file, 1)
    If @error Then ExitLoop
    If $t <> Chr(0) Then $msg &= BinaryToString($t)
	If $t = Chr(0) Then $msg &= Chr(032)

WEnd

MsgBox(4096, "", $msg)
MsgBox(4096, "", _WinAPI_OemToChar($msg))
MsgBox(4096, "", _Encoding_ANSIToUTF8($msg))
MsgBox(4096, "", _Encoding_Oem2ANSI($msg))
FileWrite("dos.txt", $msg)


Нулевой символ находится точно, меняется на что угодно ( в данном случае на пробел), но при записи результата в файл, получаются либо кракозябры, либо что-угодно, только не то, что нужно. В описании функции FileWrite прочитал, что по умолчанию текст пишется в кодировке ANSI, но может быть и в unicode, если файл открыт соответствующим образом для записи. А как быть с кодировкой 866 или какой-либо другой?
Натолкните на умную мысль)

Исходный досовский файлик прикрепил.

Для полноты картины обрисую ситуацию:
Есть старенькая программа, написанная на языке clipper исходников которой у нас нет. Из нее выводилась печатная форма на LPT принтер ( матричный). Принтер приказал долго жить, поэтому появилась задача печатать на лазерном принтере. Для этого нашлась замечатальная программка DosPRN, которая вполне справляется с такой задачей. Но, как выяснилось, в печатной форме кроме псевдографики, текста и пробелов каким-то образом используются символ, который в последствии был идентифицирован как Chr(0). По неизвестным нам законам, lpt принтер воспринимал символ Chr(0) как Chr(32) и все печаталось нормально, но вот в случае DosPRN символ Chr(0) просто пропускается и в результате часть печатной формы уезжает и сильно искажается.
 

Вложения

  • FPRINT.TXT
    2.8 КБ · Просмотры: 8

InnI

AutoIT Гуру
Сообщения
4,515
Репутация
1,232
Re: [Данные, строки] Замена символа Chr(0) в файле с кодировкой 866 на символ Chr(032) ( пробел

Код:
$text = BinaryToString(FileRead("fprint.txt"))
$text = StringRegExpReplace($text, "\x00", " ")
$file = FileOpen("fprint.txt", 2 + 512)
FileWrite($file, $text)
FileClose($file)
 
Автор
T

Twilight_Wolf

Новичок
Сообщения
16
Репутация
0
Re: [Данные, строки] Замена символа Chr(0) в файле с кодировкой 866 на символ Chr(032) ( пробел

Огромное Вам спасибо! Все работает! Я ни за что бы не догадался о таком хитром параметре функции FileOpen - 2+512 - в официальной справке об этом не написано.
 
A

Alofa

Гость
Re: [Данные, строки] Замена символа Chr(0) в файле с кодировкой 866 на символ Chr(032) ( пробел

Twilight_Wolf сказал(а):
... FileOpen - 2+512 - в официальной справке об этом не написано.
Как раз там и пишется:
https://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm
 
Автор
T

Twilight_Wolf

Новичок
Сообщения
16
Репутация
0
Re: [Данные, строки] Замена символа Chr(0) в файле с кодировкой 866 на символ Chr(032) ( пробел

Спасибо! Видимо не там смотрел: http://autoit-script.ru/autoit3_docs/functions/FileOpen.htm - вот тут об этом не упоминается
 

InnI

AutoIT Гуру
Сообщения
4,515
Репутация
1,232
Re: [Данные, строки] Замена символа Chr(0) в файле с кодировкой 866 на символ Chr(032) ( пробел

Twilight_Wolf
тут об этом не упоминается
Русская справка актуальна для версии 3.3.8.1. Дальнейшее развитие AutoIt в ней не отражено. Используйте оригинальную английскую, поставляемую в комплекте установки. Ну или хотя бы сравнивайте с ней.
 
Верх