Konwertuj kodowanie plików tekstowych

15

Często spotykam się z plikami tekstowymi (takimi jak pliki napisów w moim ojczystym języku, perskim ) z problemami z kodowaniem znaków. Te pliki są tworzone w systemie Windows i zapisywane z nieodpowiednim kodowaniem (wydaje się być ANSI), który wygląda bełkotliwie i nieczytelnie, tak jak to:

wprowadź opis zdjęcia tutaj

W systemie Windows można to łatwo naprawić za pomocą Notepad ++, aby przekonwertować kodowanie na UTF-8, jak poniżej:

wprowadź opis zdjęcia tutaj

Prawidłowy czytelny wynik wygląda następująco:

wprowadź opis zdjęcia tutaj

Dużo szukałem podobnego rozwiązania na GNU / Linux, ale niestety sugerowane rozwiązania (np. To pytanie ) nie działają. Przede wszystkim, Widziałem ludzi sugerują, iconva recodejednak nie miałem szczęścia z tych narzędzi. Przetestowałem wiele poleceń, w tym następujące, i wszystkie zawiodły:

$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt 

Żaden z nich nie działał!

Używam Ubuntu-14.04 i szukam prostego rozwiązania (GUI lub CLI), które działa tak samo jak Notepad ++.

Jednym z ważnych aspektów bycia „prostym” jest to, że użytkownik nie musi określać kodowania źródłowego; raczej narzędzie powinno automatycznie wykryć kodowanie źródłowe, a użytkownik powinien zapewnić tylko kodowanie docelowe. Niemniej jednak z przyjemnością dowiem się o działającym rozwiązaniu, które wymaga podania kodowania źródłowego.

Jeśli ktoś potrzebuje przypadku testowego do zbadania różnych rozwiązań, powyższy przykład jest dostępny poprzez ten link .

Seyed Mohammad
źródło
2
Spróbuj: vim '+set fileencoding=utf-8' '+wq' file.txt.
muru
Farsi powinno być iso-639, ale to nie wydaje się być dostępny w jednej iconvlub recode. Przynajmniej nie widzę tego w wynikach iconv -l.
terdon
@muru Przetestowałem twoją sugestię, vimale nie zadziałała.
Seyed Mohammad
@SeyedMohammad nadal wyglądał tak samo?
muru
@muru Yup! Brak zmiany.
Seyed Mohammad

Odpowiedzi:

12

Te pliki Windows z perskim tekstem są zakodowane w systemie Windows-1256 . Można go więc rozszyfrować za pomocą polecenia podobnego do wypróbowanego OP, ale z różnymi zestawami znaków. Mianowicie:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(wypowiedziane na podstawie skarg oryginalnego plakatu; patrz komentarze)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

Zakłada się, że zmienna środowiskowa LANG jest ustawiona na ustawienia regionalne UTF-8. Aby przekonwertować na dowolne kodowanie (UTF-8 lub inne), niezależnie od aktualnych ustawień regionalnych, można powiedzieć:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

Oryginalny plakat jest także mylony z semantyką narzędzi do przekodowywania tekstu (recode, iconv). W przypadku kodowania źródłowego ( source.. lub -f) należy określić kodowanie, z którym plik zostanie zapisany (przez program, który go utworzył). Nie niektóre (naiwne) domysły oparte na znakach mojibake w programach, które próbują (ale nie potrafią) odczytać. Wypróbowanie ISO-8859-15 lub WINDOWS-1252 dla perskiego tekstu było oczywiście impasem: te kodowania po prostu nie zawierają żadnej perskiej litery.

Incnis Mrsi
źródło
@Seyed Mohammad: teraz z wyraźnie określonymi poleceniami.
Incnis Mrsi,
Dzięki! Drugie polecenie (to za pomocą iconv) działało. Ale pierwszy (przy użyciu recode) nie działał poprawnie, a wynik nadal był bełkotliwy. Edytuj swoją odpowiedź, aby zawierała tylko iconvpolecenie, a ja oznaczę je jako odpowiedź.
Seyed Mohammad,
1
Aby być wolnym od ustawień zmiennej LANG, można zrobić: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtco przetestowałem i pracowałem. Dlatego może być dobrym pomysłem edytowanie polecenia w ten sposób.
Seyed Mohammad,
Napisałem przydatny skrypt na podstawie działającego polecenia, które wyjaśniłem w innej odpowiedzi tutaj. Mam nadzieję, że pomoże innym perskim użytkownikom Linuksa, ponieważ bardzo mi pomaga.
Seyed Mohammad,
@karel: Dzięki, „narzekać” jest czasownikiem - fraza została napisana niegramatycznie.
Incnis Mrsi,
1

Oprócz tego iconv, że jest to bardzo przydatne narzędzie samo lub w skrypcie, istnieje naprawdę proste rozwiązanie, próbując znaleźć ten sam problem dla greckich zestawów znaków (Windows-1253 + ISO-8859-7).

Wszystko, co musisz zrobić, to otworzyć plik tekstowy za pomocą okna dialogowego „Otwórz” Gedit, a nie klikając go dwukrotnie . W dolnej części okna dialogowego znajduje się menu rozwijane dla Kodowania, które jest ustawione na „Automatycznie wykrywane” . Zmień go na „Windows-125x” lub inny odpowiedni zestaw kodów, a tekst będzie doskonale czytelny w Gedit. Możesz go następnie zapisać za pomocą kodowania UTF-8, aby mieć pewność, że nie będziesz mieć tego samego problemu w przyszłości ...

Giorgos_tph
źródło
1

Jako komplementarne rozwiązanie problemu przygotowałem przydatny skrypt Bash oparty na iconvpoleceniu z odpowiedzi Incnisa Mrsiego :

#!/bin/bash

if [ $# -lt 1 ]
then
   echo 'Specify at least one file to fix.'
   exit 1
fi

# Temp file to store conversion attempt(s).
tmp='tmp.fixed'

for file in "$@"
do
  # Try to fix the file encoding.
  if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
    echo "Fixed: '$file'"
    cat $tmp > "$file"
  else
    echo "Failed to fix: '$file'"
  fi
done
rm $tmp

Zapisz ten skrypt jako fix-encoding.sh, daj mu uprawnienia do wykonywania, używając go chmod +x fix-encoding.shi użyj go w następujący sposób:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

Ten skrypt spróbuje naprawić kodowanie dowolnej liczby plików dostarczanych jako dane wejściowe. Pamiętaj, że pliki zostaną ustalone w miejscu, więc zawartość zostanie zastąpiona.

Seyed Mohammad
źródło
Nie musisz umieszczać pliku $ poza  …  ”, ponieważ zmienne są rozwijane zarówno pod podwójnym cudzysłowem, jak i otwartym tekstem. Tylko „plik $” będzie renderowany dosłownie, ze znakiem dolara, przez bash.
Incnis Mrsi,
Jak wspomniałem w odpowiedzi na odpowiedź opublikowaną przez „Incnis Mrsi”, to rozwiązanie nie działa, podobnie jak ten skrypt.
Seyed Mohammad
1

Nie wiem, czy to działa z Farsi: używam Gedit, powoduje błąd przy nieprawidłowym kodowaniu i mogę wybrać to, co chcę przetłumaczyć na UTF-8, był to po prostu format nie podświetlony, ale tutaj jest zrzut ekranu !

wprowadź opis zdjęcia tutaj

Przepraszam, że w końcu przejrzałem moje pliki tekstowe, więc teraz wszystkie są konwertowane.

Uwielbiam też notatnik ++, wciąż tęsknię.

Ken Mollerup
źródło
Gedit nie może rozwiązać problemu. Mimo że Gedit nie pokazuje błędu kodowania mojego pliku, nawet jeśli to robi, nie może go naprawić. Próbowałem również „zapisać jako” z kodowaniem UTF-8 w Gedit, ale to nie rozwiązuje problemu.
Seyed Mohammad
1

Jeśli lubisz pracować w GUI zamiast w CLI, tak jak ja:

  1. Otwórz plik w Geany (edytor)
  2. Przejdź do menu Plik -> Załaduj ponownie jako
  3. Wybierz zakładane kodowanie, aby zmienić bełkot w możliwe do zidentyfikowania znaki w swoim języku. Na przykład, aby odczytać greckie napisy, przeładowałbym jako zachodnioeuropejski -> grecki (Windows-1253)
  4. Przejdź do menu Dokument > Ustaw kodowanie -> Unicode -> UTF-8
  5. Zapisać
Christos
źródło
Nie działa ..
Aurimas
0

Rozwiązaniem, które znalazłem, jest użycie edytora tekstu Microsoft Visual Studio Code, który jest darmowy i dostępny dla systemu Linux.

Otwórz plik, który chcesz przekonwertować jego kodowanie w VS-Code. W dolnej części okna znajduje się kilka przycisków. Jeden z nich jest związany z kodowaniem pliku, jak pokazano poniżej:

wprowadź opis zdjęcia tutaj

Kliknięcie tego przycisku powoduje wyświetlenie menu głównego, które zawiera dwa elementy. Z tego menu wybierz opcję „Otwórz ponownie z kodowaniem”, tak jak poniżej:

wprowadź opis zdjęcia tutaj

Spowoduje to otwarcie innego menu, które zawiera listę różnych kodowań, jak pokazano poniżej. Teraz wybierz „Arabski (Windows 1256)”:

wprowadź opis zdjęcia tutaj

To naprawi bełkotliwy tekst w następujący sposób:

wprowadź opis zdjęcia tutaj

Teraz kliknij ponownie przycisk kodowania i tym razem wybierz opcję „Zapisz z kodowaniem”, tak jak poniżej:

wprowadź opis zdjęcia tutaj

I w nowym menu wybierz opcję „UTF-8”:

wprowadź opis zdjęcia tutaj

Spowoduje to zapisanie poprawionego pliku przy użyciu kodowania UTF-8:

wprowadź opis zdjęcia tutaj

Gotowy! :)

Seyed Mohammad
źródło
Próbowałem „Zapisz z kodowaniem”, ale pokazuje poprzedni kodowanie agian, w moim przypadku jego UTF8
chaitanya