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.