Metin dosyalarını karakter kümeleri arasında dönüştürmenin en iyi yolu?


526

Metin dosyalarını karakter setleri arasında dönüştürmek için en hızlı, en kolay araç veya yöntem nedir?

Özellikle, UTF-8'den ISO-8859-15'e ve tam tersine dönüştürmem gerekiyor.

Her şey geçerli: en sevdiğiniz kodlama dilinde bir satır, komut satırı araçları veya işletim sistemi, web siteleri vb. İçin diğer yardımcı programlar.

Şimdiye kadarki en iyi çözümler:

Linux / UNIX / OS X / cygwin'de:

  • Troels Arvin tarafından önerilen Gnu iconv en iyi filtre olarak kullanılır . Evrensel olarak erişilebilir gibi görünüyor. Misal:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    Ben'in de işaret ettiği gibi , iconv kullanan bir çevrimiçi dönüştürücü var .

  • Cheekysoft tarafından önerilen GNU recode ( manuel ) , bir veya birkaç dosyayı yerinde dönüştürecektir . Misal:

    $ recode UTF8..ISO-8859-15 in.txt
    

    Bu, daha kısa takma adlar kullanır:

    $ recode utf8..l9 in.txt
    

    Recode ayrıca farklı satır sonu türleri ve kodlamalar arasında dönüştürme yapmak için kullanılabilecek yüzeyleri de destekler :

    Yeni satırları LF'den (Unix) CR-LF'ye (DOS) dönüştürün:

    $ recode ../CR-LF in.txt
    

    Base64 kodlama dosyası:

    $ recode ../Base64 in.txt
    

    Bunları da birleştirebilirsiniz.

    Unix satır sonlarına sahip Base64 kodlu UTF8 dosyasını Dos satır sonlarına sahip Base64 kodlu Latin 1 dosyasına dönüştürün:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

Powershell ( Jay Bazuzi ) bulunan Windows'ta :

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (Yine de ISO-8859-15 desteği yok; desteklenen karakter kümelerinin unicode, utf7, utf8, utf32, ascii, bigendianunicode, varsayılan ve oem olduğunu söylüyor.)

Düzenle

Şunu mu demek istediniz: iso-8859-1 destek? "String" kullanmak bunu yapar, örn.

gc -en string in.txt | Out-File -en utf8 out.txt

Not: Olası numaralandırma değerleri "Bilinmeyen, Dize, Unicode, Bayt, BigEndianUnicode, UTF8, UTF7, Ascii" dir.


Denedim gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlama utf-8 dosyasına dönüştürür ama sonra boş! Notepad ++, dosyanın Ansi biçiminde olduğunu, ancak geçerli bir karakter kümesi olmadığını anladığım kadarıyla okuduğunu mu söylüyor? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

2
Sadece ilgili bir soruya cevap arayan bu harika - harika bir özet! Sadece recodebir dosya adı vermezseniz, aynı zamanda bir filtre olarak işlev görmeye değer olduğunu düşündüm , örneğin:recode utf8..l9 < in.txt > out.txt
Jez

iconv.com/iconv.htm benim için ölü gibi görünüyor mu? (zaman aşımı)
Andrew Newby

2
Kullanıyorsanız enca, giriş kodlamasını belirtmeniz gerekmez. Dili belirlemek için genellikle yeterlidir enca -L ru -x utf8 FILE.TXT.
Alexander Pozdneev

1
Aslında, iconv bir filtre yerine yerinde dönüştürücü olarak çok daha iyi çalıştı. Kullanarak 2 milyondan fazla satır içeren bir dosyayı dönüştürmek, iconv -f UTF-32 -t UTF-8 input.csv > output.csvyalnızca yaklaşık üç yüz satır kaydetti. Yerinde sürümü kullanarak iconv -f UTF-32 -t UTF-8 file.csvbaşarıyla 2 milyon artı satır dönüştürdü.
Nicolay77

Yanıtlar:


246

Bağımsız yarar yaklaşımı

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

Bu bağımsız değişkenlerden hiçbirini belirtmeniz gerekmez. Varsayılan olarak, genellikle UTF-8 olan geçerli yerel ayarınız olur.


4
Çizgi olmayan sürümlerin kullanılamamasıyla karşılaşan herkes için, iconv'nin OSX (ve muhtemelen tüm BSD) sürümleri, çeşitli UTF- * kodlamaları için çizgi olmayan takma adları desteklemiyor gibi görünüyor. iconv -l | grep UTFiconv kopyanızın desteklediği UTF ile ilgili tüm kodlamaları size söyleyecektir.
coredumperror

14
Girdi dosyanızın kodlamasını bilmiyor musunuz? chardet in.txtEn iyi tahminde bulunmak için kullanın . Sonuç, içinde KODLAMA olarak kullanılabilir iconv -f ENCODING.
Güveç

4
Geçersiz karakter önle çıkış (kaçınarak illegal input sequence at positionmesajlar) ve "benzer" karakterleri ile "tuhaf" karakterleri değiştirmek: iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
knb

Bunu seviyorum, çünkü çoğu NIX platformunda standart. Ama aynı zamanda VIM komut seçeneği (diğer adı: bakınız ex) aşağıda . Ek bilgi: (1) siz (muhtemelen) ile -f(kimden) seçeneğini belirtmeniz gerekmez iconv. (2) file --mime-encoding <file/s>komut, kodlamayı ilk önce anlamanıza yardımcı olabilir.
fr13d

1
FWIW filekomutu kaynağımı UTF-16 Little Endian olarak bildirdi; çalışan iconv -f UTF-16 -t UTF-8...ASCII yanlış dönüştürdü, ben açıkça iconv -f UTF-16LE...UTF-8
Plato

90

VIM'i deneyin

Eğer varsa vimbunu kullanabilirsiniz:

Her kodlama için test edilmemiştir.

Bunun en güzel yanı, kaynak kodlamasını bilmek zorunda olmamanızdır.

vim +"set nobomb | set fenc=utf8 | x" filename.txt

Bu komutun doğrudan dosyayı değiştirdiğini unutmayın


Açıklama bölümü!

  1. +: Bir dosyayı açarken doğrudan komut girmek için vim tarafından kullanılır. Genellikle belirli bir satırda bir dosyayı açmak için kullanılır:vim +14 file.txt
  2. |: Çoklu komutların ayırıcısı ( ;bash gibi )
  3. set nobomb : utf-8 ürün ağacı yok
  4. set fenc=utf8: Yeni kodlamayı utf-8 doc bağlantısına ayarla
  5. x : Dosyayı kaydet ve kapat
  6. filename.txt : dosya yolu
  7. ": Qotes borular yüzünden burada. (aksi takdirde bash onları bash borusu olarak kullanacaktır)

Oldukça havalı, ama biraz yavaş. Birkaç dosyayı aynı anda dönüştürmek için bunu değiştirmenin bir yolu var mı (vim'in başlatma maliyetlerinden tasarruf etmek için)?
DomQ

Açıklama için teşekkür ederim! Bomba / nobomb ayarını okuyana kadar dosyanın başlangıcında zor anlar yaşadım.
jjwdesign

1
np, ayrıca bom kullanıyorsanız vim -bveyahead file.txt|cat -e
Boop

1
örneğin:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel

Bunu CSV dosyalarının kodlamasını dönüştürmek için kullandım ve karakter setinin gerçekten değiştiğini gördüğümde gerçekten heyecanlandım. Ne yazık ki, dosyayı MySQL'e yüklemeye gittiğimde, vim komutunu çalıştırmadan önce olduğundan daha fazla sütun vardı. Diğer tüm dosya içeriğini aynı bırakarak dosyayı açmak, kodlamayı dönüştürmek ve kaydetmek / kapatmak mümkün mü acaba?
NightOwlPrgmr

39

Linux altında , farklı karakter kümeleri ve satır sonu sorunları arasında denemek ve dönüştürmek için çok güçlü recode komutunu kullanabilirsiniz. recode -l size aracın dönüştürebileceği tüm biçimleri ve kodlamaları gösterir. ÇOK uzun bir liste olması muhtemeldir.


Nasıl dönüştürülür LF? Var /CRve /CR-LFama hayır/LF
Aaron Franke


20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

BOM girişinin doğru olduğunu varsayabilirseniz en kısa sürüm:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt

1
İşte daha iyi çalışan daha kısa bir sürüm. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Larry Battle

@LarryBattle: Nasıl Set-Contentdaha iyi çalışır Out-File?
Jay Bazuzi

... ah. Sanırım neredeyse aynı şeyler. Her iki sürümün de file-utf8.txtaynı çıktı dosyasını kullandığından beri her iki sürümün de girdi için aynı dosyayı kullandığını varsayıyordum çünkü örneğinizi çalıştırmada sorun yaşadım file-utf7.txt.
Larry Battle

UTF16'yı desteklememesi dışında bu gerçekten harika olurdu. UTF32'yi destekler, ancak UTF16'yı desteklemez! Ben bir çok Microsoft yazılımı (fe SQL server bcp) UTF16 ısrar - ve daha sonra onların yardımcı programı dönüştürmek olmaz dışında dosyaları dönüştürmek gerekmez. Az söylemek ilginç.
Noah

Denedim gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlama utf-8 dosyasına dönüştürür ama sonra boş! Notepad ++, dosyanın Ansi biçiminde olduğunu, ancak geçerli bir karakter kümesi olmadığını anladığım kadarıyla okuduğunu mu söylüyor? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

16

İconv Bash işlevini deneyin

Bunu içine koydum .bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

.. gibi dosyaları dönüştürmek için:

utf8 MyClass.java

8
geçici bir dosya oluşturmak için tmp = $ (mktmp) kullanmak daha iyidir. Ayrıca, rm ile olan çizgi gereksizdir.
LMZ

1
otomatik algılama giriş formatı ile bu işlevi tamamlayabilir misiniz?
mlibre

3
dikkat, bu işlev iconv çağrısının başarılı olduğunu doğrulamadan giriş dosyasını siler.
philwalk

Bu, metin dosyasının içeriğini değiştirir. Ben bir UTF-8 BOM ile BOM dosyası olmadan bir UTF-8 dışarı çıkmayı bekliyor çalıştırdı, ancak dosyanın başında tercih etti.
Aaron Franke

14

Notepad ++ 'ı deneyin

Windows'ta ben den dönüştürme yapmak için Notepad ++ kullanmayı başardı ISO-8859-1 için UTF-8 . Öğesini "Encoding"ve ardından öğesini tıklayın "Convert to UTF-8".


13

Otomatik karakter seti algılamasıyla find özelliğini kullanan Oneliner

Eşleşen tüm metin dosyalarının karakter kodlaması otomatik olarak algılanır ve eşleşen tüm metin dosyaları utf-8kodlamaya dönüştürülür :

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

Şu adımları gerçekleştirmek için, bir alt kabuk shile kullanıldığında -execbir tek astar çalışan -cbayrağı ve konumsal argüman olarak dosya adı geçen "$1"ile -- {}. Arasında, utf-8çıktı dosyası geçici olarak adlandırılır converted.

Nerede file -bi:

  • -b, --brief Çıktı satırlarına dosya adlarının başına başlamayın (kısa mod).

  • -i, --mime Dosya komutunun daha geleneksel insan tarafından okunabilir olanlar yerine mime türü dizeler vermesine neden olur. Böylece, örneğin, text/plain; charset=us-asciiyerine söyleyebilir ASCII text. sedYalnızca komut keser bu us-asciikadar gereklidir iconv.

findKomut Böyle bir dosya yönetim otomasyonu için çok yararlıdır. Daha fazla findbolluk için buraya tıklayın .


3
En azından sürümümde Mac OS X üzerinde çalışmak için bu çözümü biraz uyarlamak zorunda kaldım. find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
Brian J. Miller

1
Kodunuz MinGW-w64 (en son sürüm) ile Windows 7'de de çalıştı. Paylaştığınız için teşekkürler!
silvioprog

@rmuller sedKomut, karakter kodlamasının otomatik olarak algılanmasını sağlayan bilerek yapılmıştır. Bunu şimdi açıklamak için cevabı genişlettim. Alakasız kalan tüm yorumların silinmesi okuyucuya karşı nazik olacaktır. Teşekkür ederim.
Serge Stroobandt

@SergeStroobandt Belki yeterince açık değildim. Demek istediğim, "file -bi" yerine "file -b --mime-encoding" kullandığınızda sonucu sed ile filtrelemeye gerek yoktur. Bu komut zaten yalnızca dosya kodlamasını döndürür. Örneğin "us-ascii"
örneğinizde

Bu aslında Linux'ta benim için hiçbir şey yapmıyor gibi görünüyor. Bir dosyayı BOM ile UTF-8 olarak kaydettim ve BOM olmadan UTF-8'e dönüştürmesini bekledim ve olmadı.
Aaron Franke

3

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);


1
Bu ifade, dizeleri dönüştürürken harika çalışır, ancak dosyalar için çalışmaz.
jjwdesign

2

DOS / Windows: Kod sayfasını kullan

chcp 65001>NUL
type ascii.txt > unicode.txt

chcpKod sayfasını değiştirmek için komut kullanılabilir. Kod sayfası 65001, UTF-8 için Microsoft adıdır. Kod sayfası ayarlandıktan sonra, aşağıdaki komutlar tarafından üretilen çıktı kod sayfası kümesinden olur.


1

özellikler dosyası (Java) yazmak için normalde linux (nane ve ubuntu dağıtımları) kullanın:

$ native2ascii filename.properties

Örneğin:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

Not: Özel karakterleri zorlamak için Portekiz'deki İcra numarasını bir / iki yazdım.

Benim durumumda, ilk yürütmede bu mesajı aldım:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

İlk seçeneği (gcj-5-jdk) yüklediğimde sorun tamamlandı.

Umarım bu birine yardım eder.




0

Bunun için en sevdiğim araç, iki çok kullanışlı özelliğe sahip Jedit (java tabanlı bir metin editörü):

  • Kullanıcının farklı bir kodlama ile bir metni yeniden yüklemesini sağlayan (ve sonucu görsel olarak kontrol etmek için)
  • Kullanıcının kaydetmeden önce kodlamayı (ve satır sonu karakterini) açıkça seçmesini sağlayan başka bir kod

0

Mevcut karakter kümesinin belirtildiği durum çubuğunun (altta) sağındaki IntelliJ IDEA IDE'de yüklü dosyanın kodlamasını değiştirmeniz yeterlidir. Yeniden Yükle veya Dönüştür, Dönüştür'ü kullanır. Orijinal dosyayı önceden yedeklediğinizden emin olun.


0

MacOS GUI uygulamaları ekmek ve tereyağınızsa, SubEthaEdit genellikle kodlama- wrangling için gittiğim metin editörüdür - "dönüşüm önizlemesi", çıkış kodlamasındaki tüm geçersiz karakterleri görmenizi ve bunları düzeltmenizi / kaldırmanızı sağlar.

Ve şimdi açık kaynak kodlu , bu yüzden onlar için yay 😉.


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.