Batch converter codificação de arquivo desconhecido para UTF-8

votos
2

Eu preciso converter alguns arquivos para UTF-8, porque eles estão sendo emitidas em uma UTF-8 sites de outra forma eo conteúdo parece um pouco fugly às vezes.

I pode fazer isso agora ou posso fazê-lo como eles são lidos em (através de PHP, apenas usando fopen, nada extravagante). Todas as sugestões bem-vindos.

Publicado 02/06/2009 em 15:06
fonte usuário
Em outras línguas...                            


4 respostas

votos
3

Fazê-lo apenas uma vez iria melhorar o desempenho e reduzir o potencial de futuros erros, mas se você não sabe a codificação, você não pode fazer uma conversão correta em tudo.

Respondeu 02/06/2009 em 15:08
fonte usuário

votos
2

Minha primeira tentativa neste sentido seria:

  1. Se é sintaticamente válido UTF-8, assumir que é UTF-8.
  2. Se houver apenas bytes correspondentes a caracteres válidos no ISO 8859-1 (Latin-1), suponha que.
  3. Caso contrário, falhar.
Respondeu 02/06/2009 em 15:11
fonte usuário

votos
1

um arquivo pode conter dados de diferentes páginas de código?

Se sim, então você não pode fazer a conversão do grupo em tudo. Você teria que saber cada página de códigos de cada sub seqüência única em seu arquivo.

Se não é possível a lote converter um arquivo de cada vez, mas supondo que você sabe o que página de códigos que arquivo tem. Então, nós estamos mais ou menos de volta a mesma situação acima, que acabou de se mudar a abstração do âmbito de aplicação corda sub arquivar escopo.

Assim, a pergunta que você precisa perguntar a si mesmo é. Você tem informações sobre o que CodePage alguns dados pertence? Se não, ainda vai olhar fugly.

Você sempre pode fazer algumas análises sobre os dados e acho que página de códigos, e embora isto possa torná-lo um pouco menos fuglier, você ainda está adivinhando, e, portanto, ainda será fugly :)

Respondeu 02/06/2009 em 16:19
fonte usuário

votos
7

Eu não tenho uma solução clara para PHP, mas para Python Eu pessoalmente usado biblioteca Universal Encoding Detector , que faz um trabalho muito bom em adivinhar o que codifica a arquivo está sendo escrito como.

Só para começar, aqui está um script Python que eu tinha usado para fazer a conversão (o propósito original é que eu queria convertidos uma base de código japonês de uma mistura de UTF-16 e Shift-JIS, o que eu fiz uma suposição padrão se chardet não é confiante de detectar o tipo de codificação):

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')
Respondeu 09/06/2009 em 07:11
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more