iconv

Konwertuje kodowanie znaków pliku tekstowego (np. ISO-8859-2 na UTF-8).

iconv to systemowe narzędzie do konwersji kodowania znaków w plikach tekstowych. Czytasz plik zapisany w jednym kodowaniu (np. starym ISO-8859-2 czy windowsowym CP1250), a iconv wypluwa ten sam tekst zapisany w innym, najczęściej UTF-8. To pierwsza rzecz, po którą sięgasz, gdy w terminalu zamiast polskich ogonków widzisz krzaki typu za��ó��ka, a w pliku CSV od księgowej zamiast „ł” siedzi „³”. iconv jest częścią glibc, więc na każdym Linuksie jest dostępny od ręki.

Składnia i najważniejsze opcje

Podstawowa składnia wygląda tak: iconv -f KODOWANIE_ZRODLA -t KODOWANIE_DOCELOWE plik. Domyślnie wynik leci na standardowe wyjście (ekran), więc prawie zawsze przekierowujesz go do pliku albo używasz -o.

  • -f, --from-code — kodowanie pliku wejściowego (z czego konwertujesz)
  • -t, --to-code — kodowanie docelowe (na co konwertujesz)
  • -o, --output PLIK — zapisuje wynik do pliku zamiast na ekran
  • -l, --list — wypisuje wszystkie znane kodowania, jakie obsługuje Twój system
  • -c — pomija znaki, których nie da się przekonwertować, zamiast przerywać z błędem
  • //TRANSLIT — dopisek do kodowania docelowego: znaki spoza zestawu zastępuje podobnymi (np. „ä” na „a”), a beznadziejne przypadki dostają „?”
  • //IGNORE — dopisek do kodowania docelowego: po prostu wyrzuca znaki nie do konwersji

Przykłady użycia

  • iconv -f ISO-8859-2 -t UTF-8 plik.txt > plik_utf8.txt — klasyk: stary plik w Latin-2 ląduje jako czysty UTF-8.
  • iconv -f WINDOWS-1250 -t UTF-8 -o czysty.csv brudny.csv — naprawia CSV z Windowsa, zapisując wynik przez -o bez przekierowania.
  • iconv -f UTF-8 -t ASCII//TRANSLIT nazwa.txt — spłaszcza polskie znaki do ASCII (np. do nazw plików), zamieniając „ó” na „o”.
  • iconv -f UTF-8 -t ISO-8859-1//IGNORE -o out.txt in.txt — wymusza konwersję do Latin-1 i milcząco wyrzuca to, co się nie mieści.
  • iconv -l | grep -i 1250 — sprawdza, czy Twój system zna dane kodowanie, zanim się zdziwisz.

Częste błędy i pułapki

Najczęstszy komunikat to iconv: illegal input sequence at position N — oznacza, że źródłowe kodowanie podane po -f nie zgadza się z rzeczywistością pliku. Zanim ratujesz się -c albo //IGNORE, ustal prawdziwe kodowanie poleceniem file -i plik.txt, bo te flagi po cichu kasują dane.

Druga mina: nie nadpisuj pliku wejściowego w tym samym poleceniu. iconv ... plik > plik wyzeruje plik, zanim iconv zdąży go przeczytać — zostaniesz z pustką. Zawsze zapisuj do nowej nazwy albo używaj -o na inny plik.

Pamiętaj też, że nazwy kodowań nie rozróżniają wielkości liter (utf-8 i UTF-8 działają tak samo), ale ich zestaw zależy od systemu — wersja na macOS/BSD potrafi mieć ich mniej niż glibc na Linuksie, więc iconv -l bywa różny na różnych maszynach.

Powiązane komendy: file (wykrywanie kodowania), recode (alternatywna konwersja), dos2unix (zamiana znaków końca linii), enca (zgadywanie kodowania tekstów).