Jak zmienić kodowanie z tekstu non-ISO Extended-ASCII z terminatorami linii CRLF na UTF-8?

21

Mam plik TXT:

$ file -i x.txt
x.txt: text/plain; charset=unknown-8bit
$ file x.txt 
x.txt: Non-ISO extended-ASCII text, with CRLF line terminators

I niektóre znaki są niepoprawnie zakodowane:

trwa³y, sta³y, usuwaæ

Jak mogę zmienić kodowanie tego pliku na UTF-8? Do tej pory wypróbowałem następującą metodę:

$ iconv -f ASCII -t UTF-8 x.txt
                puiconv: illegal input sequence at position 4

Może powinienem w jakiś sposób użyć extended ASCII( high ASCII), ale nie mogę go znaleźć na iconvliście kodowania.

Patryk
źródło
2
czy możesz gdzieś przesłać plik?
janos
Jest poręczny lista 8-bitowe kodowanie ISO, wszystkie pokazane side-by-side, tutaj . Czy któryś z nich jest podobny do tego, co obserwujesz w swoim pliku? Na przykład, jeśli uważasz, że „sta³y” powinien być „stacy”, to znajdź, które kodowanie ma „c” dla dowolnego dziwnego kodu szesnastkowego w tym słowie.
John1024
Prawdopodobnie w 90% przypadków „tekst o rozszerzonym kodzie ASCII spoza ISO” będzie plikiem zakodowanym na stronie kodowej Windows 1252 . „Jest to prawdopodobnie najczęściej używane 8-bitowe kodowanie znaków na świecie”. (Wikipedia). Spróbuj najpierw:iconv -f windows-1252 -t utf-8 file
nyov

Odpowiedzi:

33

file mówi „tekst bez rozszerzenia ISO-ASCII”, ponieważ wykrywa, że ​​jest to:

  • najprawdopodobniej plik „tekstowy” z braku znaków kontrolnych (wartości bajtów 0–31) innych niż podział wiersza;
  • „Rozszerzony ASCII”, ponieważ istnieją znaki spoza zakresu ASCII (wartości bajtów ≥128);
  • „Non-ISO”, ponieważ istnieją znaki z zakresu 128–159 ( ISO 8859 rezerwuje ten zakres dla znaków kontrolnych).

Musisz dowiedzieć się, w jakim kodowaniu znajduje się ten plik. Możesz wypróbować automatyczne rozpoznawanie Enca . Może być konieczne popchnięcie go we właściwym kierunku, mówiąc w jakim języku jest tekst.

enca x.txt
enca -L polish x.txt

Aby przekonwertować plik, przekaż -xopcję:enca -L polish x.txt -x utf8 >x.utf8.txt

Jeśli nie możesz lub nie chcesz używać Enca, możesz odgadnąć kodowanie ręcznie. Trochę rozejrzenia się powiedziało mi, że to jest tekst polski, a słowa są trwałe, stałe, usuwać, więc szukamy tłumaczenia gdzie ³łi æż. Wygląda na to, że latin-2 lub latin-10 lub więcej (biorąc pod uwagę „non-ISO” CP1250, który przeglądasz jako latin1 . Aby przekonwertować plik na UTF-8, możesz użyć recode lub iconv .

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt
Gilles „SO- przestań być zły”
źródło
Nie biorę udziału w < x.txt > x.utf8.txtDlaczego, <a następnie >? Jak to działa?
Filip Bartuzi,
@FilipBartuzi <i >wykonywać wejście i wyjście przekierowanie odpowiednio .
Gilles „SO- przestań być zły”
1

Otwórz plik tekstowy za pomocą gedit, aw oknie dialogowym „zapisz jako…” zobaczysz aktualne kodowanie.

gedit
źródło
0

Czy próbowałeś dowiedzieć się, jakie dokładne kodowanie to x.txt? Otrzymasz listę obsługiwanych kodowań z

iconv --list

Czasami zdarza mi się, że dostaję niezgodność między latin1 i utf8. Następnie często pomaga przekonwertować go z utf8 i odwrotnie.


źródło
0

Utworzyłem skrypt automatycznej konwersji za pomocą biblioteki enca , używam go na moim serwerze NAS do konwersji napisów na UTF-8, ale można go wykorzystać do dowolnej automatycznej konwersji

Zapraszam do korzystania :)

EDYTOWAĆ:

#!/bin/bash
LANGUAGE=czech
TO=utf8
CONVERT="enca -L $LANGUAGE -x $TO"

# Find and onvert
find ./ -type f -name "*.srt" | while read fn; do
  IS_TARGET=`enca "${fn}" | egrep -ow -m 1 'UTF-8|Unrecognized|KOI8-CS2|7bit ASCII|UCS-2|Macintosh Central European'`

    if [ "$IS_TARGET" != "UTF-8" ] &&
       [ "$IS_TARGET" != "UCS-2" ] &&
       [ "$IS_TARGET" != "Macintosh Central European" ] &&
       [ "$IS_TARGET" != "Unrecognized" ] &&
       [ "$IS_TARGET" != "7bit ASCII" ] &&
       [ "$IS_TARGET" != "KOI8-CS2" ]; then

        echo "${fn} ---- Will be converted!"
    # optional backup of original srt
        # cp "${fn}" "${fn}.bak"
        $CONVERT "${fn}"
    fi  

done
Barlog951
źródło