ISO-dışı genişletilmiş ASCII metninden, CRLF satır sonlandırıcılı UTF-8'e kodlama nasıl değiştirilir?


21

Bir txt dosyam var:

$ 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

Ve yanlış kodlanmış bazı karakterler var:

trwa³y, sta³y, usuwaæ

Bu dosyanın kodlamasını UTF-8 olarak nasıl değiştirebilirim? Şu ana kadar aşağıdaki yolu denedim:

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

Belki bir şekilde use extended ASCII( high ASCII) kullanmalıyım ama iconvkodlama listesinde bulamıyorum .


2
dosyayı bir yere yükleyebilir misin?
janos

Burada yan yana gösterilen, 8-bit ISO kodlamaların kullanışlı bir listesi var . Bunlardan herhangi biri, dosyanızda gözlemlediklerinize yakın görünüyor mu? Örneğin, "stayy" nin "stacy" olması gerektiğini düşünüyorsanız, hangi kodlamanın garip hex kodunun bu kelime için ne olduğuna göre "c" olduğunu bulun.
John1024

Muhtemelen zamanın% 90'ı, "ISO dışı genişletilmiş ASCII metni", Windows 1252 kod sayfasında şifrelenmiş bir dosya olacak . "Muhtemelen dünyada en çok kullanılan 8 bitlik karakter kodlamasıdır." (Vikipedi). İlk önce deneyin:iconv -f windows-1252 -t utf-8 file
nyov

Yanıtlar:


33

file "ISO dışı genişletilmiş ASCII metni" ifadesini kullandığını belirtti:

  • büyük olasılıkla satır sonları dışındaki kontrol karakterlerinin eksikliğinden (0–31 bayt değerleri) bir “metin” dosyası;
  • “Genişletilmiş ASCII” çünkü ASCII aralığının dışında karakterler var (bayt değerleri ≥128);
  • “ISO dışı” çünkü 128–159 aralığında karakterler var ( ISO 8859 bu karakteri kontrol karakterleri için ayırıyor ).

Bu dosyayı kodlamanın hangi kodda olduğunu bulmak zorundasınız . Enca'nın otomatik olarak tanınmasını deneyebilirsiniz . Metnin hangi dilde olduğunu söyleyerek doğru yönde dürtmek zorunda kalabilirsiniz.

enca x.txt
enca -L polish x.txt

Dosyayı dönüştürmek için -xseçeneği iletin:enca -L polish x.txt -x utf8 >x.utf8.txt

Enca kullanmak istemiyorsanız veya istemiyorsanız, kodlamayı manuel olarak tahmin edebilirsiniz. Etrafa Biraz bu Polonyalı metindir ve bir çeviri için aradığınız bu yüzden kelimeler, trwały, STALY, usuważ olduğunu söyledi nerede ³łveæ → 'nınż . Bu, latin-2 veya latin-10'a benziyor veya daha muhtemel ( latin1 olarak görüntülemekte olduğunuz “ISO olmayan” CP1250 veriliyorsa . Dosyayı UTF-8'e dönüştürmek için recode veya iconv kullanabilirsiniz .

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt

< x.txt > x.utf8.txtNeden katılmıyorum , neden kullanıyoruz <peki >? O nasıl çalışır?
Filip Bartuzi


1

Metin dosyasını gedit ile açın ve "farklı kaydet .." iletişim kutusunda geçerli kodlamayı göreceksiniz.


0

Hangi kodlamanın x.txt olduğunu bulmaya çalıştınız mı? İle desteklenen kodlamaların bir listesini alırsınız

iconv - liste

Bazen bana latin1 ve utf8 arasında bir uyumsuzluk alıyorum olur. Sonra sık sık utf8 ve tersi dönüştürmek için yardımcı olur.


0

Bir otomatik oluşturdum Enca kütüphanesini kullanarak dönüşüm betiği , NAS'ımda altyazıları UTF-8'e dönüştürmek için kullanıyorum, ancak herhangi bir otomatik dönüşüm için kullanılabilir

Kullanmaktan çekinmeyin :)

DÜZENLE:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.