Toplu UTF-8 için bilinmeyen dosya kodlamasını dönüştürmek

4 Cevap php

Onlar bir başka UTF-8 sitede çıktılanmasını konum ve içerik zamanlarda fugly biraz görünüyor çünkü UTF-8 için bazı dosyaları dönüştürmek gerekir.

Ben şimdi bunu yapabilirsiniz ya da onlar okunduğu gibi (sadece fopen, fantezi bir şey kullanarak, PHP) aracılığıyla yapabilirsiniz. Herhangi önerilerinizi bekliyoruz.

4 Cevap

Ben PHP için net bir çözüm yok, ancak Python için ben şahsen Universal Encoding Detector library hangi dosya olarak yazılır ediliyor ne kodlayan tahmin oldukça iyi bir iş yok kullanılır.

Sadece başlamak için, burada dönüşüm yapmak için kullanmış olduğu bir Python komut dosyası (orijinal amaçlı I UTF-16 karışımından bir Japon kod tabanı dönüştürülecek istedim ve Shift-JIS Ben varsayılan tahmin yapılmış, yani bulunuyor Chardet kodlama) tespit emin değilse:

import sys
import codecs
import chardet
from chardet.universaldetector import UniversalDetector

""" Detects encoding

Returns chardet result"""
def DetectEncoding(fileHdl):
detector = UniversalDetector()
for line in fileHdl:
    detector.feed(line)
    if detector.done: break
detector.close()
return detector.result


""" Reencode file to UTF-8
"""
def ReencodeFileToUtf8(fileName, encoding):
    #TODO: This is dangerous ^^||, would need a backup option :)
    #NOTE: Use 'replace' option which tolerates errorneous characters
    data = codecs.open(fileName, 'rb', encoding, 'replace').read()
    open(fileName, 'wb').write(data.encode('utf-8', 'replace'))

""" Main function
"""
if __name__=='__main__':
    # Check for arguments first
    if len(sys.argv) <> 2:
    sys.exit("Invalid arguments supplied")

    fileName = sys.argv[1]
    try:
        # Open file and detect encoding
        fileHdl = open(fileName, 'rb')
        encResult = DetectEncoding(fileHdl)
        fileHdl.close()

        # Was it an empty file?
        if encResult['confidence'] == 0 and encResult['encoding'] == None:
            sys.exit("Possible empty file")

        # Only attempt to reencode file if we are confident about the
        # encoding and if it's not UTF-8
        encoding = encResult['encoding'].lower()
        if encResult['confidence'] >= 0.7:
            if encoding != 'utf-8':
                ReencodeFileToUtf8(fileName, encoding)
        else:
            # TODO: Probably you could make a default guess and try to encode, or
            #       just simply make it fail

        except IOError:
            sys.exit('An IOError occured')

Sadece bir kez bunu yapıyor performansını artırmak ve gelecekteki olası hataları azaltır, ancak kodlama bilmiyorsanız, hiç doğru bir dönüşüm yapamaz olur.

Bu benim ilk denemem olacak:

  1. Bu sözdizimsel olarak geçerli UTF-8 ise, UTF-8 olduğunu varsayalım.
  2. If there are only bytes corresponding to valid characters in ISO 8859-1 (Latin-1), assume that.
  3. Aksi halde, başarısız.

Bir dosya farklı kod sayfaları veri içerebilir?

Eğer evet ise, o zaman tüm toplu dönüştürme yapamaz. Eğer dosyada her bir alt dizenin her kod sayfasını bilmesi gerekir.

Hayır bu toplu mümkün ise bir seferde bir dosya dönüştürme, ancak dosya olduğunu ne codepage biliyorum varsayarak. Bu yüzden yukarıdaki gibi veya daha az geri aynı durumdayız, biz sadece kapsamı dosyasına alt dize kapsamından soyutlama hareket ettik.

Yani, kendinize sormanız gereken soru. Bazı veriler aittir CODEPAGE hakkında bilgi var mı? Değilse, yine fugly bakacağız.

Her zaman veriler üzerinde bazı analizler yapmak ve kod sayfasını sanırım, ve bu biraz daha az fuglier yapmak olabilir ancak, yine de tahmin edilir ve bu nedenle hala fugly olacak olabilir :)