Metin Dosyası Kodlamasını Dönüştür


15

Karakter dosyaları ile sık sık metin dosyaları (anadilim, Farsça altyazı dosyaları gibi ) ile karşılaşıyorum. Bu dosyalar Windows'ta oluşturulur ve aşağıdaki gibi anlamsız ve okunamaz görünen uygun olmayan bir kodlama (ANSI gibi görünüyor) ile kaydedilir:

resim açıklamasını buraya girin

Windows'da, kodlamayı aşağıdaki gibi UTF-8'e dönüştürmek için Notepad ++ kullanarak kolayca düzeltebilirsiniz :

resim açıklamasını buraya girin

Doğru okunabilir sonuç şöyledir:

resim açıklamasını buraya girin

GNU / Linux'da benzer bir çözüm için çok şey aradım, ancak ne yazık ki önerilen çözümler (örneğin bu soru ) çalışmıyor. En önemlisi, insanların önerdiğini gördüm iconvve recodebu araçlarla hiç şansım olmadı. Aşağıdakiler de dahil olmak üzere birçok komutu test ettim ve hepsi başarısız oldu:

$ 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 

Bunların hiçbiri işe yaramadı!

Ubuntu-14.04 kullanıyorum ve Notepad ++ gibi çalışan basit bir çözüm (GUI veya CLI) arıyorum.

"Basit" olmanın önemli bir yönü , kullanıcının kaynak kodlamasını belirlemek zorunda olmamasıdır; bunun yerine kaynak kodlama araç tarafından otomatik olarak algılanmalı ve kullanıcı tarafından yalnızca hedef kodlama sağlanmalıdır. Ancak yine de, kaynak kodlamanın sağlanmasını gerektiren çalışan bir çözüm hakkında bilgi sahibi olmaktan memnuniyet duyacağım.

Birisinin farklı çözümleri incelemek için bir test senaryosuna ihtiyacı varsa, yukarıdaki örneğe bu bağlantıdan erişilebilir .


2
Deneyin: vim '+set fileencoding=utf-8' '+wq' file.txt.
muru

Farsça olmalı iso-639ama bu da satışa sunulacak görünmüyor iconvya recode. En azından çıkışında görmüyorum iconv -l.
terdon

@muru Önerinizi test ettim vimama işe yaramadı.
Seyed Mohammad

@SeyedMohammad hala aynı görünüyordu?
muru

@muru Yup! Değişiklik yok.
Seyed Mohammad

Yanıtlar:


12

Farsça metin içeren bu Windows dosyaları Windows-1256'da kodlanmıştır . Bu yüzden OP'ye benzer bir komutla deşifre edilebilir, ancak farklı karakter kümeleriyle. Yani:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(asıl afişin şikayetlerini kınadı; yorumlara bakın)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

Bu, LANG ortam değişkeninin UTF-8 yerel ayarına ayarlandığını varsayar. Geçerli yerel ayardan bağımsız olarak herhangi bir kodlamaya (UTF-8 veya başka bir şekilde) dönüştürmek için şunu söyleyebiliriz:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

Orijinal poster aynı zamanda metin kodlama araçlarının (recode, iconv) anlamıyla da karıştırılır. Kaynak kodlaması için ( kaynak.. veya -f) dosyanın kaydedildiği kodlamayı belirtmek gerekir ( dosyayı oluşturan program tarafından). Okumaya çalışan (ancak başarısız olan) programlardaki mojibake karakterlerine dayanan bazı (naif) tahminler değil. Farsça bir metin için ISO-8859-15 veya WINDOWS-1252'yi denemek kesinlikle bir çıkmazdı: bu kodlamalar yalnızca Farsça bir harf içermiyor.


@Seyed Mohammad: şimdi açıkça belirtilen komutlarla.
Incnis Mrsi

Teşekkürler! İkinci komut (kullanan iconv) çalıştı. Ancak birincisi (kullanma recode) düzgün çalışmadı ve çıktı hala anlamsızdı. Cevabınızı yalnızca iconvkomutu içerecek şekilde düzenleyin , cevap olarak işaretleyeceğim.
Seyed Mohammad

1
Ayrıca LANG değişken ayarından bağımsız olmak için, aşağıdakileri yapabilirsiniz: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txttest ettiğim ve çalıştığım. Bu yüzden komutunuzu böyle düzenlemek iyi bir fikir olabilir.
Seyed Mohammad

Burada başka bir cevapta açıkladığım çalışma komutuna dayanan yararlı bir senaryo yazdım. Umarım diğer Fars Linux kullanıcılarına çok yardımcı olur.
Seyed Mohammad

@karel: Teşekkürler, “şikayet” bir fiildir - ifade sembolik olmayan bir şekilde yazılmıştır.
Incnis Mrsi

1

Bunun yanı sıra iconv, tek başına veya bir senaryoda çok kullanışlı bir araç olan, Yunan karakter setleri için aynı sorunu bulmaya çalıştığım gerçekten basit bir çözüm var (Windows-1253 + ISO-8859-7).

Yapmanız gereken tüm metin dosyasını açmak için Gedit yönettiği "Aç" diyalog yoluyla ve çift tıklayarak değil . İletişim kutusunun altında Kodlama için "Otomatik Olarak Algılandı" olarak ayarlanmış bir açılır menü bulunur . "Windows-125x" veya diğer uygun kod kümesiyle değiştirin, metin Gedit'te mükemmel okunabilir olacaktır. Daha sonra UTF-8 kodlamasını kullanarak kaydedebilirsiniz, sadece gelecekte aynı sorunu yaşamayacağınızdan emin olmak için ...


1

Soruna tamamlayıcı bir çözüm olarak, Incnis Mrsi'nin cevabındaniconv gelen komuta dayalı yararlı bir Bash senaryosu hazırladım :

#!/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

Bu komut dosyasını şu şekilde kaydedin fix-encoding.sh, kullanarak yürütme izni verin chmod +x fix-encoding.shve şu şekilde kullanın:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

Bu komut dosyası, girdi olarak sağlanan herhangi bir sayıda dosyanın kodlamasını düzeltmeye çalışacaktır. Dosyaların yerinde sabitleneceğini unutmayın, böylece içeriklerin üzerine yazılacaktır.


Değişkenler çift tırnak altında ve açık metin olarak genişletildiği için $ dosyasını "  …  " dışında bırakmanız gerekmez . Sadece '$ file' tam anlamıyla dolar işareti ile bash tarafından işlenecektir.
Incnis Mrsi

'Incnis Mrsi' tarafından gönderilen cevaba yanıt olarak belirttiğim gibi, bu çözüm işe yaramadı ve bu senaryo da öyle.
Seyed Mohammad

1

Bunun Farsça ile çalışıp çalışmadığını bilmiyorum: Gedit kullanıyorum, yanlış kodlama ile hata veriyor ve UTF-8'e çevirmek istediğim şeyi seçebiliyorum, sadece metin yanmayan formattı, ancak burada bir ekran görüntüsü var !

resim açıklamasını buraya girin

Üzgünüm sonunda metin dosyalarımı aldım, şimdi hepsi dönüştürüldü.

Notepad ++ da çok sevdim, hala özledim.


Gedit sorunu çözemez. Gedit, dosyam için bir kodlama hatası göstermese de, düzelttiğinde bile düzeltemez. Ben de Gedit UTF-8 kodlama ile "farklı kaydet" denedim, ama bu sorunu çözmez.
Seyed Mohammad

1

Benim yaptığım gibi CLI yerine GUI'de çalışmayı seviyorsanız:

  1. Dosyayı Geany ile aç (editör)
  2. Git Dosya > - menü yükle olarak
  3. Anlamsızlığı dilinizde tanımlanabilir karakterlere dönüştürmek için varsayılan kodlamayı seçin. Örneğin, Yunanca subs okumak için Batı Avrupa -> Yunanca (Windows-1253)
  4. Git Belge menüsü> Set Kodlama -> Unicode -> UTF-8
  5. Kayıt etmek


0

Bulduğum çalışma çözümü , freeware ve Linux için mevcut olan Microsoft Visual Studio Code metin düzenleyicisini kullanıyor .

Kodlamasını VS Kodunda dönüştürmek istediğiniz dosyayı açın. Pencerenin altında birkaç düğme vardır. Bunlardan biri, aşağıda gösterildiği gibi dosya kodlamasıyla ilgilidir:

resim açıklamasını buraya girin

Bu düğmeyi tıklattığınızda iki öğe içeren bir genel menü açılır. Bu menüden, aşağıdaki gibi "Kodlamayla Yeniden Aç" seçeneğini belirtin:

resim açıklamasını buraya girin

Bu, aşağıda gösterildiği gibi farklı kodlamanın bir listesini içeren başka bir menü açar. Şimdi "Arapça (Windows 1256)" seçin:

resim açıklamasını buraya girin

Bu anlamsız metni şu şekilde düzeltir:

resim açıklamasını buraya girin

Şimdi kodlama düğmesini tekrar tıklayın ve bu sefer aşağıdaki gibi "Kodlama ile Kaydet" seçeneğini belirtin:

resim açıklamasını buraya girin

Ve yeni menüde "UTF-8" seçeneğini seçin:

resim açıklamasını buraya girin

Bu, düzeltilmiş dosyayı UTF-8 kodlamasını kullanarak kaydedecektir:

resim açıklamasını buraya girin

Bitti! :)


"Kodlama ile kaydet" denendi, ancak önceki kodlama ağrısını gösteriyor, benim durumumda UTF8
chaitanya
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.