ANSI, управляющие символы и нечитаемый файл

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

ANSI, управляющие символы и нечитаемый файл

Сообщение wwswowsogon » 18.12.2024 21:14:23

Всем доброго времени суток!

Внезапно столкнулся со странной проблемой.

Есть текстовый файл, судя по Notepad++, в кодировке ANSI.
В этом файле много каких-то данных, среди которых часто попадаются управляющие символы, BEL, SUB, SOH, а также NUL.
В конце первой же строки находится последовательность BEL SUB SOH.

При попытке прочитать файл стандартным методом
Код: Выделить всё
while not EoF do ReadLn(TF, s);

Читается только 1 строка. И всё. Если считывать файл через TStringList, то читается гораздо больше строк, но опять встаёт, теперь уже на последовательности из NUL.
Зато если конвертировать файл тем же Notepad++ в UTF8, то файл читается полностью на "ура".
Никогда такого не видел. Возможно, здесь что-то банальное, но я не могу понять, как с этим бороться.
Есть идеи? :)

Добавлено спустя 2 минуты 56 секунд:
P. S. Ну и да, если все "лишние" символы убрать из файла вручную, то тоже проблема исчезает.
wwswowsogon
постоялец
 
Сообщения: 157
Зарегистрирован: 23.12.2008 20:41:37

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение xchgeaxeax » 18.12.2024 21:56:58

Тогда прочитайте его как бинарный с стрим и грузите из него
xchgeaxeax
постоялец
 
Сообщения: 142
Зарегистрирован: 11.05.2023 03:51:40

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение wwswowsogon » 18.12.2024 22:04:08

xchgeaxeax писал(а):Тогда прочитайте его как бинарный с стрим и грузите из него


Да вот тоже уже думал об этом. Надо попробовать :)
wwswowsogon
постоялец
 
Сообщения: 157
Зарегистрирован: 23.12.2008 20:41:37

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение Alexander » 19.12.2024 08:17:56

А какая программа порождает такие неправильные файлы ? Может быть можно устранить проблему в корне. Читать двоично всегда возможно, но возможности средств работы с простым текстом придётся делать "с нуля". Либо создать конвертер, который прочитает двоично, отсечёт лишние символы и из временного файла уже нормально читать.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 796
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение v-t-l » 19.12.2024 09:36:33

https://en.wikipedia.org/wiki/End-of-file
Возможно, какой-то из этих символов влияет на EoF;
v-t-l
энтузиаст
 
Сообщения: 736
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение Alexander » 19.12.2024 09:55:43

Конвертер может быть простым:

Код: Выделить всё
var
fs : Int64;
a : PByte;
f : Int64;

function LoadFromFile(fn : utf8string) : boolean;
var
  fp : File of byte;
begin
Assign(fp, fn);
FileMode := 0;
{$I-}
ReSet(fp);
{$I+} if IOResult <> 0 then Exit(true);
{$I-}
fs := FileSize(fp);
{$I+} if IOResult <> 0 then Exit(true);
GetMem(a, fs);
{$I-}
BlockRead(fp, a[0], fs);
{$I+} if IOResult <> 0 then Exit(true);
{$I-}
Close(fp);
{$I+} if IOResult <> 0 then Exit(true);
Exit(false);
end;

function SaveToFile(fn : utf8string) : boolean;
var
  fp : File of byte;
begin
Assign(fp, fn);
FileMode := 1;
{$I-}
ReWrite(fp);
{$I+} if IOResult <> 0 then Exit(true);
{$I-}
BlockWrite(fp, a[0], fs);
{$I+} if IOResult <> 0 then Exit(true);
{$I-}
Close(fp);
{$I+} if IOResult <> 0 then Exit(true);
Exit(false);
end;

begin

if ParamCount < 2 then Halt;

LoadFromFile(ParamStr(1));

for f := 0 to fs-1 do begin
case a[f] of
0: Char(a[f]) := ' ';
7: Char(a[f]) := ' ';
{...}
end;
end; {next f}

SaveToFile(ParamStr(2));

end.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 796
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение sts » 19.12.2024 15:14:24

Посмотрите на фрагмент файла где текст латиницей, и если перед каждым символом есть 0 (#0) то это файл в формате UNICODE (UCS2 не UTF16), который с двухбайтовыми символами, тип WideString WideChar, в природе разве что как дамп памяти виндовой проги встречается
sts
постоялец
 
Сообщения: 440
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение wwswowsogon » 19.12.2024 17:31:27

Метод с чтением через поток и выгрузку в строку помог, успешно читается и записывается в другой файл всё содержимое файла. Однако, если сделать ShowMessage(s), то в изначальной кодировке опять выводятся данные только до первого NUL. Файл от некого инженерного ПО, который я в глаза не видел и не слышал о нем раньше. Подозреваю, что ПО довольно древнее. Попросили попробовать распарсить, вот стараюсь на досуге. Чуть позже покажу сам файл и результаты дальнейших экспериментов. :)
wwswowsogon
постоялец
 
Сообщения: 157
Зарегистрирован: 23.12.2008 20:41:37

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение Alex2013 » 20.12.2024 03:51:19

Возможно совет немного "не в тему" но что если использовать "терминалку" типа uCmdBox( из пакета cmdLine (есть в сетевом меджере пакетов в Лазарусе) ) ?
https://wiki.lazarus.freepascal.org/CmdLine
Alex2013
долгожитель
 
Сообщения: 3089
Зарегистрирован: 03.04.2013 11:59:44

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение wwswowsogon » 21.12.2024 12:08:14

Вот этот странный файл. Как я и говорил выше, он успешно считался через поток, и теперь я его разбираю по байтам/строкам. Но я по-прежнему не понимаю, почему он не читается классическими способами. Ради эксперимента попробовал то же самое сделать в Delphi XE4. Через ReadLn(TF, s) оно читается немного лучше, чем в FPC, но всё равно не полностью. Через StringList получаются почему-то только две обрезанные последние строки... :D

https://disk.yandex.ru/d/95Z5rrk5fuCs5Q
wwswowsogon
постоялец
 
Сообщения: 157
Зарегистрирован: 23.12.2008 20:41:37

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение Alexander » 21.12.2024 12:38:43

Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 796
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение Alex2013 » 21.12.2024 23:22:47

wwswowsogon писал(а):Вот этот странный файл. Как я и говорил выше, он успешно считался через поток, и теперь я его разбираю по байтам/строкам. Но я по-прежнему не понимаю, почему он не читается классическими способами. Ради эксперимента попробовал то же самое сделать в Delphi XE4. Через ReadLn(TF, s) оно читается немного лучше, чем в FPC, но всё равно не полностью. Через StringList получаются почему-то только две обрезанные последние строки... :D

https://disk.yandex.ru/d/95Z5rrk5fuCs5Q

https://micromine.atlassian.net/wiki/sp ... signer+tab
Разумеется бинарный файл не читается как тест ...
(Я в начале думал что это текст с редкой "терминальной" разметкой но там в заголовке четко прописано "THIS IS MICROMINE EXTENDED DATA FILE!" )
Ps
Но вообще забавно ...(FAR ( если открывать по F4) тоже подавился "дуют муссоны..." :wink: )
Изображение
Нейро яндекса говорит
«THIS IS MICROMINE EXTENDED DATA FILE!» — это текст, который записывается в начале расширенной начальной записи файла Micromine
Такая запись состоит из 4096 байтов (может быть даже несколько порций по 4096 байтов)
Alex2013
долгожитель
 
Сообщения: 3089
Зарегистрирован: 03.04.2013 11:59:44

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение Alexander » 22.12.2024 08:39:45

Нормально такие файлы открывает по F4 только GNU Midnight Commander - это его сильная сторона и особенность.

Код: Выделить всё
table3.STR         [----] 125 L:[  1+34  35/269] *(10918/90393b) 0032 0x020                                                                [↕][✕]
THIS IS MICROMINE EXTENDED DATA FILE!^G^Z^A^M
<?xml version="1.0" encoding="utf-8"?><metadata version="1.0"><meta-object type="title" version="1.0" time-stamp="67452301efcdab89" compulsory="t
EAST      R  8  3^M
NORTH     R  8  3^M
RL        R  8  2^M
JOIN      N  6  0^M
STRING    C 20  0^M
TUN_NAME  C 30  0^M
......    C 30  0^M
..._..... C 15  0^M
..........C 15  0^M
......_...C  6  0|......_....
........  C 10  0^M
.......   C 20  0^M
..........C 20  0|...........
........  C 10  0^M
Sector    C 20  0^M
......    C 20  0^M
..........C 60  0^M
..._.._...C 90  0|..._.._.........
ӈ^CZ...@R.\..G.@..^W...s@1                         305_V_ShK1                                                  ....                          ...
..O.m..@..G^^.I.@^B..N..s@1                         305_V_ShK1                                                  ....                          ...
.^C.w...@^R^L.\.J.@>.!35.s@1                         305_V_ShK1                                                  ....                          ..
..D<b..@&mK^[.L.@.J..{.s@1                         305_V_ShK1                                                  ....                          ...
.f.?...@\M.?.M.@C.l...s@1                         305_V_ShK1                                                  ....                          ...
^G.>e^H..@.aW..O.@u.A~..s@1                         305_V_ShK1                                                  ....                          ...
^C.ٱ^M..@.0nO.Q.@:..^N..s@1                         305_V_ShK1                                                  ....                          ...
\3^Y^Q6..@^D.   .gS.@...w9.s@1                         305_V_ShK1                                                  ....
^B......@.-0u.T.@..$^F..s@1                         305_V_ShK1                                                  ....                          ...
vZCSͻ.@2^^ĝ^KV.@1b. ٖ.s@1                         305_V_ShK1                                                  ....                          ...
..^X.2..@.6o~.V.@h^CT...s@1                         305_V_ShK1                                                  ....                          ...
.z^Dr[..@.AF.^\W.@?.e7..s@1                         305_V_ShK1                                                  ....                          ...
]..^AuĈ@.../.V.@X9..vzs@1                         305_V_ShK1                                                  ....                          ...
Yn#.vLj@.6^_hYV.@Y.I..rs@1                         305_V_ShK1                                                  ....                          ...
..h!@ʈ@rr.q.U.@.19^Osks@1                         305_V_ShK1                                                  ....                          ...
Bwe.B ͈@^4.R/V.@>N...cs@1                         305_V_ShK1                                                  ....                          ...
..q..Έ@g>..4V.@...(\_s@1                         305_V_ShK1                                                  ....                          ...
1Помощь       2Сохран       3Блок         4Замена        5Копия         6Переместить  7Поиск        8Удалить       9МенюMC       10Выход       
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 796
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение wwswowsogon » 22.12.2024 20:31:23

Alex2013 писал(а):Разумеется бинарный файл не читается как тест ...


Notepad++ -то его открывает как-то. Да и через обычный блокнот Виндовый открывается вроде нормально. Ну, как выше заметили, MC, хотя я не проверял. Я вообще до сих пор пребывал в наивной уверенности, что любой файл можно считать, как текстовый. Другой вопрос, чтоб бинарный файл текстовым редактором открывать смысла немного :)[/quote]
wwswowsogon
постоялец
 
Сообщения: 157
Зарегистрирован: 23.12.2008 20:41:37

Re: ANSI, управляющие символы и нечитаемый файл

Сообщение xchgeaxeax » 22.12.2024 21:10:43

wwswowsogon писал(а):Другой вопрос, чтоб бинарный файл текстовым редактором открывать смысла немного

Есть смысл. При наличии должного опыта таким образом можно визуально быстро определить его тип
xchgeaxeax
постоялец
 
Сообщения: 142
Зарегистрирован: 11.05.2023 03:51:40


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 10

Рейтинг@Mail.ru