Edycja pliku zapisanego w formacie UTF-8 without BOM

Odpowiedz Nowy wątek
2019-07-28 13:02
0

Mam taki pliczek tekstowy ( https://www.mediafire.com/file/2mt9bkwbefa1mib/index.txt/file )
Chcę podmienić linię

<InputFilePath>\\XEON-PC\RipBot264temp\job1\video.mkv</InputFilePath>

i następnie zapisać.

Problem jest taki że nie jest to zwykłe kodowanie ANSI tylko UTF-8 without BOM. Jak wygląda procedura obróbki takich plików w takim np. TStringList?

Mam Delphi 10.3 oraz Delphi 7 z zainstalowanym komponentem TNT ( https://github.com/rofl0r/TntUnicode ).

edytowany 1x, ostatnio: furious programming, 2019-07-28 14:50

Pozostało 580 znaków

2019-07-28 13:28
1

Plik Utf8 należałoby wczytać do zmiennej string, przekonwertować do Ansii funkcją Utf8ToAnsi, dokonać potrzebnych edycji, ponownie przekonwertować do Utf8 funkcją AnsiToUtf8 i zapisać na dysk.

Ale ten plik (index.txt) jest kodowany w ANSI tyle, że zapisany w formacie UNIX (znaki końca linii to #10 zamiast #13#10)

Pozostało 580 znaków

2019-07-28 13:31
0

Ciekawe dlaczego notepad++ wykrywa go jako UTF-8 without BOM?

edytowany 2x, ostatnio: furious programming, 2019-07-28 14:50

Pozostało 580 znaków

2019-07-28 14:33
0

Nie wiem, której wersji npp używasz. Ja zatrzymałem się na v7.5.9 ponieważ stwierdziłem, że nowsze nie radzą sobie dobrze z automatycznym wykrywaniem kodowania.
Jakieś dziwne znaki widzę na końcu pliku w sekcji ExtraDataList.

edytowany 1x, ostatnio: pelsta, 2019-07-28 14:37

Pozostało 580 znaków

2019-07-28 14:36
0
pelsta napisał(a):

Nie wiem, której wersji npp używasz. Ja zatrzymałem się na v7.5.9 ponieważ stwierdziłem, że nowsze nie radzą sobie dobrze z automatycznym wykrywaniem kodowania.

6.3

Pozostało 580 znaków

2019-07-28 14:49
0

Te dziwne znaki muszą tam być! Gdy edytuje ten plik to one mi znikają!

Prosty przykład

StringList:=TStringList.Create;
  StringList.LoadFromFile('index.txt');
  StringList.SaveToFile('newindex.txt');

Oryginalny plik
title

nowy plik
title

Nie dość że "dziwne znaki" znikają to jeszcze brakuje paru lini na końcu. WTF?!

edytowany 2x, ostatnio: Atak_Snajpera, 2019-07-28 14:52

Pozostało 580 znaków

2019-07-28 14:54
0

Znaki kontrolne zapisywane w plikach tekstowych powinny być escapowane, tak aby nie wpływały one na metody czytające ciągi znaków. A tu drugim znakiem jest NULL i do widzenia – się nie dziw że ucina.


edytowany 1x, ostatnio: furious programming, 2019-07-28 14:54

Pozostało 580 znaków

2019-07-28 15:02
0

Dobra. To w praktyce jak zapisać tak aby nic nie ucinało?

Pozostało 580 znaków

2019-07-28 15:24
0

Escape character – poczytaj, znajdziesz tam dużo przykładów. Sprawdź też czy masz dostęp do metod, które pozwalają formatować takie ciągi (kodować i odkodowywać). Jeśli nie to będziesz musiał sobie takie napisać.

W razie czego zamiast escapowania, możesz konwertować ciąg na jakiś Base64 lub coś podobnego – byle ciąg wyjściowy nie zawierał surowych znaków kontrolnych.


edytowany 3x, ostatnio: furious programming, 2019-07-28 15:25

Pozostało 580 znaków

2019-07-28 15:36
0

Ja pierdziele! Tyle roboty aby podmienić jedną głupią linie w pliku tekstowym...

TO NIE JEST PLIK TEKSTOWY!!! Jakby był to plik tekstowy to by to działało. DO jest jakiś miks tekstu i raw data a tego się w ten sposób nie robi. Jak chcesz grzebać w takich plikach to użyj TFileStream i pochodnych - abrakadaber 2019-07-28 22:47

Pozostało 580 znaków

2019-07-28 17:38
0

No jak się surowe NULLe pakuje do tekstowego pliku to nie dziwne, że API się sypie.


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0