Czy pliki tekstowe przechowują metodę kodowania do późniejszego dekodowania?

19
  1. Zastanawiałem się, czy niektóre pliki tekstowe przechowują metodę kodowania wraz z zawartością tekstową do późniejszego dekodowania?
  2. Czy też zadaniem przeglądarki tekstu jest odgadnięcie metody kodowania dla danego pliku tekstowego, a zgadywanie może nie zawsze być prawidłowe? Jeśli tak, jak zgaduje to przeglądarka tekstów?
Tim
źródło
Jeśli jest to plik zwykłego tekstu, to nie przechowuje niczego na temat kodowania. Nie mogę jednak powiedzieć o bogatym tekście.
Wuffers
Tak, mówię o zwykłym tekście.
Tim

Odpowiedzi:

19

Zastanawiałem się, czy niektóre pliki tekstowe przechowują metodę kodowania wraz z zawartością tekstową do późniejszego dekodowania?

Odpowiedź Marka Szymańskiego jest poprawna - w zwykłym pliku tekstowym nie ma wyraźnych informacji o kodowaniu - taka jest definicja „zwykłego pliku tekstowego”, „zwykły” odnosi się do faktu, że w pliku nie ma metadanych.

Jednak niektóre aplikacje umieszczają znak kolejności bajtów (BOM) w plikach tekstowych zakodowanych jako UTF-16 lub UTF-32 / UCS-4. BOM tak naprawdę nie ma oznaczać kodowania (wskazuje nazwę bajtu, jak sama nazwa wskazuje), ale wiele aplikacji wykorzystuje obecność BOM do rozpoznawania UTF-16 / UTF-32, więc służy jako wskaźnik kodowania.

Czy też zadaniem przeglądarki tekstu jest odgadnięcie metody kodowania dla danego pliku tekstowego, a zgadywanie może nie zawsze być prawidłowe? Jeśli tak, jak zgaduje to przeglądarka tekstów?

Tak, przeglądarka tekstu może tylko zgadywać. Zwykle używa pewnej heurystyki:

  • W niektórych kodowaniach (zwłaszcza w UTF-8) nie wszystkie sekwencje bajtów są poprawne. Więc aplikacja może po prostu spróbować zdekodować plik jako UTF-8. Jeśli się powiedzie, plik to prawdopodobnie UTF-8; jeśli nie powiedzie się przez znalezienie nieprawidłowej sekwencji bajtów, nie jest. Oto jak np. vimDziała domyślnie: Najpierw spróbuje użyć UTF-8 podczas odczytu pliku; jeśli to się nie powiedzie, wraca do normy ISO-8859-1.
  • W większości starszych kodowań 8-bitowych każda sekwencja bajtów jest poprawna. W takim przypadku można czasem zgadnąć kodowanie, patrząc na histogram bajtów (częstotliwość różnych bajtów / sekwencji bajtów). Internet Explorer zwykł to robić, aby „odgadnąć” kodowanie strony. Jest to jednak bardzo podatne na błędy, więc niewiele programów to robi.

W większości przypadków program musi zostać wyraźnie poinformowany o kodowaniu pliku tekstowego, w przeciwnym razie nie będzie w stanie poprawnie go odczytać.

Śleske
źródło
Jak więc file -bidziała, jeśli BOM nie jest używany?
Old Geezer
@OldGeezer: filema różne heurystyki do określania typu pliku i kodowania. Najczęściej szuka ciągów znaków lub sekwencji bajtów w pliku. Jeśli potrzebujesz bardziej szczegółowych informacji, prawdopodobnie będziesz musiał przeczytać źródło. Lub po prostu zadaj osobne pytanie :-).
śleske,
@OldGeezer: A BTW, filenie może niezawodnie wykryć większości kodowań tekstu (ponieważ jest to bardzo trudne). Strona podręcznika zawiera pewne informacje na temat wykrywania zestawu znaków - fiległównie rozpoznaje tylko ASCII, UTF-8/16, EBCDIC i ISO-8859-x. Na przykład plik zakodowany w KOI8-R jest zgłaszany jako „ISO-8859-1”.
śleske,
4

Zwykłe pliki tekstowe nie przechowują żadnych informacji o ich kodowaniu. Przeglądarka określa to na podstawie ustawionego dla niego kodowania znaków. Nie może tego ustalić samodzielnie, ponieważ wszystko jest takie samo dla komputera.

Wuffers
źródło
Przeglądarki tekstowe nie mogą więc rozróżniać metod kodowania plików tekstowych. Jeśli przeglądarka tekstowa otrzyma plik obiektowy / wykonywalny, czy będzie w stanie stwierdzić, że nie jest to plik tekstowy?
Tim
Nie, nie może. Spróbuje otworzyć go jak plik tekstowy. I oczywiście wyświetli kilka zniekształconych rzeczy. Jedynym sposobem na odróżnienie kodowania jest ręczna zmiana kodowania.
Wuffers
@Tim: Większość przeglądarek tekstowych używa heurystyki, aby sprawdzić, czy coś jest plikiem tekstowym. Jeśli plik ma wiele znaków niedrukowalnych, wielu przeglądających i redaktorów ostrzeże (np. lessI grepna Unix / Linux to zrobi).
śleske,