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 .


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.


@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 ...


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.


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ę.


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ć

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! :)


Próbowałem „Zapisz z kodowaniem”, ale pokazuje poprzedni kodowanie agian, w moim przypadku jego UTF8
chaitanya
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.