Pergunta

Estou tentando analisar um arquivo XML (dados OSM) com o expatriado e há linhas com alguns caracteres Unicode que o expatriado não consegue analisar:

<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />

<tag k="name" v="Cin\x8e? Rex" />

(A codificação do arquivo XML na linha de abertura é "UTF-8")

O arquivo é bastante antigo e deve ter havido erros.Em arquivos modernos, não vejo erros UTF-8 e eles são analisados ​​corretamente.Mas e se meu programa encontrar um símbolo quebrado, que solução alternativa posso fazer?É possível juntar o codec bz2 (eu analiso um arquivo compactado) e o codec utf-8 para ignorar os caracteres quebrados ou alterá-los para "?"?

Foi útil?

Solução

Não tenho certeza se os caracteres '�' foram introduzidos aqui, mas se você os possui nos dados originais, parece ser um problema de gerador que introduziu ufffd charactes como:

"Usado para substituir um caráter de entrada cujo valor é desconhecido ou não representável em unicode"

citado de:http://www.fileformat.info/info/unicode/char/fffd/index.htm

Gambiarra?Apenas uma ideia para extensão:

good = True
buf = None
while True:
if good:
        buf = f.read(buf_size)
        else:
        # try again with cleaned buffer
        pass
        try:
            xp.Parse(buf, len(buf) == 0)
            if (len(buf) == 0):
                    break
        good = True
    except ExpatError:
        if xp.ErrorCode  == XML_ERROR_BAD_CHAR_REF:
            # look at ErrorByteIndex (or nearby)
            # for 0xEF 0xBF 0xBD (UTF8 replacement char) and remove it
            good = False
        else:
            # other errors processing
            pass

Ou limpe o buffer de entrada + casos extremos (sequência parcial no final do buffer).Não me lembro se o expatriado do python permite atribuir um manipulador de erros personalizado.Isso seria mais fácil então.

Se eu limpar sua amostra dos caracteres '�', ela será processada ok.\xd1 não falha.

Dados OSM?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top