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:
W systemie Windows można to łatwo naprawić za pomocą Notepad ++, aby przekonwertować kodowanie na UTF-8, jak poniżej:
Prawidłowy czytelny wynik wygląda następująco:
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ą, iconv
a recode
jednak 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 .
vim '+set fileencoding=utf-8' '+wq' file.txt
.iso-639
, ale to nie wydaje się być dostępny w jednejiconv
lubrecode
. Przynajmniej nie widzę tego w wynikachiconv -l
.vim
ale nie zadziałała.Odpowiedzi:
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)
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ć:
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.źródło
iconv
) działało. Ale pierwszy (przy użyciurecode
) nie działał poprawnie, a wynik nadal był bełkotliwy. Edytuj swoją odpowiedź, aby zawierała tylkoiconv
polecenie, a ja oznaczę je jako odpowiedź.iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txt
co przetestowałem i pracowałem. Dlatego może być dobrym pomysłem edytowanie polecenia w ten sposób.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 ...
źródło
Jako komplementarne rozwiązanie problemu przygotowałem przydatny skrypt Bash oparty na
iconv
poleceniu z odpowiedzi Incnisa Mrsiego :Zapisz ten skrypt jako
fix-encoding.sh
, daj mu uprawnienia do wykonywania, używając gochmod +x fix-encoding.sh
i użyj go w następujący sposób: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.
źródło
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 !
Przepraszam, że w końcu przejrzałem moje pliki tekstowe, więc teraz wszystkie są konwertowane.
Uwielbiam też notatnik ++, wciąż tęsknię.
źródło
Jeśli lubisz pracować w GUI zamiast w CLI, tak jak ja:
źródło
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:
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:
Spowoduje to otwarcie innego menu, które zawiera listę różnych kodowań, jak pokazano poniżej. Teraz wybierz „Arabski (Windows 1256)”:
To naprawi bełkotliwy tekst w następujący sposób:
Teraz kliknij ponownie przycisk kodowania i tym razem wybierz opcję „Zapisz z kodowaniem”, tak jak poniżej:
I w nowym menu wybierz opcję „UTF-8”:
Spowoduje to zapisanie poprawionego pliku przy użyciu kodowania UTF-8:
Gotowy!
:)
źródło