Edycja pliku zapisanego w formacie UTF-8 without BOM

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

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

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

Rejestracja: 14 lat temu

Ostatnio: 2 godziny temu

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

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

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

Rejestracja: 14 lat temu

Ostatnio: 2 godziny temu

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

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

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

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

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
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 2 minuty temu

Lokalizacja: Tuchów

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

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

0

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

Pozostało 580 znaków

2019-07-28 15:24
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 2 minuty temu

Lokalizacja: Tuchów

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

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

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
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 2 minuty temu

Lokalizacja: Tuchów

0

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


Pozostało 580 znaków

Odpowiedz

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