Поиск файлов в кодировке ISO-8859-1? - PullRequest
2 голосов
/ 26 февраля 2009

У меня есть куча файлов со смесью кодировок, в основном ISO-8859-1 и UTF-8.

Я хотел бы сделать все файлы UTF-8, но при попытке пакетного кодирования этих файлов, используя у iconv возникают некоторые проблемы. (Файлы сокращаются вдвое и т. Д.)

Полагаю, причина в том, что iconv требует знать кодировку 'from', поэтому, если команда выглядит следующим образом

iconv -f ISO-8859-1 -t UTF-8 in.php -o out.php

но 'in.php', если он уже закодирован в UTF-8, это вызывает проблемы (поправьте меня, если я не прав)

Есть ли способ, чтобы я мог перечислить все файлы, кодировка которых не является UTF-8?

Ответы [ 5 ]

4 голосов
/ 26 февраля 2009

Вы не можете найти файлы, которые определенно соответствуют ISO-8859-1, но вы можете найти файлы, которые соответствуют UTF-8 (что в отличие от большинства многобайтовых кодировок дает вам разумную уверенность в том, что они действительно UTF-8). moreutils имеет инструмент isutf8, который может сделать это за вас. Или вы можете написать свой собственный, это было бы довольно просто.

2 голосов
/ 26 февраля 2009

Часто трудно определить, просто прочитав текстовый файл, в кодировке UTF-8 или нет. Вы можете сканировать файл на наличие определенных байтов индикатора , которые никогда не встречаются в UTF-8, и если вы их найдете, вы знаете, что файл находится в ISO-8859-1. Если вы найдете байт с установленным битом старшего разряда, где байты как непосредственно перед, так и сразу после него не имеют установленного бита старшего разряда, вы знаете, что он закодирован в ISO (поскольку байты> 127 всегда встречаются в последовательностях в UTF -8). Кроме того, это в основном догадки - вам придется взглянуть на последовательности байтов с этим старшим набором битов и посмотреть, имеет ли смысл их появление в ISO-8859-1 или нет.

Программа file попытается угадать кодировку текстового файла, который она обрабатывает, вы можете попробовать это.

1 голос
/ 26 февраля 2009

Есть ли способ, чтобы я мог перечислить все файлы, кодировка которых не является UTF-8?

Возможно, не так легко в bash, но это тривиальная задача, например. Python:

import os.path

for child in os.path.listdir(TARGETDIR):
    child= os.path.join(TARGETDIR, child)
    if os.path.isfile(child):
        content= open(child, 'rb').read()

        try:
            unicode(content, 'utf-8')
        except UnicodeDecodeError:
            open(child, 'wb').write(unicode(content, 'iso-8859-1'))

Это предполагает, что любой файл, который может интерпретироваться как действительная последовательность UTF-8 , равен единице (и поэтому может быть оставлен в покое), тогда как все, что не должно быть ISO-8859-1.

Это разумное предположение, если эти два являются единственно возможными кодировками, потому что действительные последовательности UTF-8 (по крайней мере, из двух символов с верхним битом в определенном порядке) относительно редки в реальном латинском тексте, где мы склонны только использовать нечетные одиночные акцентированные символы здесь и там.

0 голосов
/ 09 августа 2017

найти довольно просто

find . -print0 | xargs -0 file | grep 8859
0 голосов
/ 26 февраля 2009

Какой контент? XML? Тогда да, если правильно помечены сверху. Общие текстовые файлы? Я не знаю ни одного априорного способа узнать, какая кодировка используется, хотя иногда это возможно с помощью умного кода. «Помеченные» текстовые файлы UTF-8, под которыми я подразумеваю текстовые файлы UTF-8 с отметкой Byte-Order ? (Для UTF-8 трехбайтовая последовательность «ï» ¿) Вероятно. Символы порядка байтов не будут обычно появляться как первые три символа в кодированном файле ISO-8859-1. (Который bobince указал в комментарии к этому сообщению, поэтому я исправляю свой пост.)

Для ваших целей существуют инструменты, которые могут решить большую часть вашего вопроса. Логан Капальдо указал один в его ответ .

Но, в конце концов, если бы всегда можно было однозначно выяснить, какая кодировка символов использовалась в файле, тогда утилите iconv не нужно было бы указывать кодировку "from". :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...