Нахождение фрагментов текста не-Latin-1 в файле преимущественно Latin-1? - PullRequest
1 голос
/ 06 января 2012

Я полагаю, что английским .txt будет Latin-1, но он может содержать фрагменты в другой кодировке. Существуют ли библиотеки или инструменты для поиска этих фрагментов?

Мне известны такие вещи, как библиотека Python chardat, но я специально ищу инструмент для тестирования файла Latin-1 и обнаружения аномалий. Даже обычная библиотека обнаружения была бы хороша, если бы она могла сказать мне точку, в которой она обнаружила шаблон не из Latin-1, и дать мне индекс.

Особенно приветствуются инструменты командной строки и библиотеки Python.

Ответы [ 2 ]

0 голосов
/ 06 января 2012

Каковы основания для ваших убеждений, что файл (1) является латинским-1 (2) может содержать фрагменты в другой кодировке? Насколько большой файл? Что такое «обычная библиотека обнаружения»? Рассматривали ли вы возможность того, что это может быть кодировка Windows, например cp1252?

Некоторые общие диагностики:

# preliminaries
text = open('the_file.txt', 'rb').read()
print len(text), "bytes in file"

# How many non-ASCII bytes?
print sum(1 for c in text if c > '\x7f'), "non-ASCII bytes"

# Will it decode as UTF-8 OK?
try:
    junk = text.decode('utf8')
    print "utf8 decode OK"
except UnicodeDecodeError, e:
    print e

# Runs of more than one non-ASCII byte are somewhat rare in single-byte encodings
# of languages written in a Latin script ...
import re
runs = re.findall(r'[\x80-\xff]+', text)
nruns = len(runs)
print nruns, "runs of non-ASCII bytes"
if nruns:
    avg_rlen = sum(len(run) for run in runs) / float(nruns)
    print "average run length: %.2f bytes" % avg_rlen
# then if indicated you could write some code to display runs in context ...
0 голосов
/ 06 января 2012

Latin-1 (или, может быть, вы имеете в виду его латинский-15 вариант со знаком евро?) Не так легко обнаружить.

Простой подход может заключаться в том, чтобы проверить, действительно ли используются неиспользуемые символы (см. таблицу здесь ) - если есть, то что-то не так. Однако, чтобы обнаружить более тонкие нарушения, нужно на самом деле проверить, является ли язык одним из тех, для которых используется латиница-1. В противном случае нет никакого способа различить 8-битные кодировки. Гораздо лучше никогда не смешивать 8-битные кодировки, не пометив каким-либо образом изменение кодировки ...

...