2009-02-26 3 views
2

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

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

Я supposse причина заключается в том, что Iconv требует, чтобы знать «от» кодирования, так что если команда выглядит так

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

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

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

ответ

4

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

0

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

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

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

+0

UTF-8 файлов не должны «правильно», есть BOM (хотя на практике они часто делают. И UTF-8 кодировке BOM вполне может существовать начало файла ISO-8859-1 (это означало бы «ï» ¿») ... это, конечно, очень маловероятно. – bobince

2

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

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

1

Есть ли способ, чтобы я мог перечислять все файлы, кодировка которых не 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

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

find . -print0 | xargs -0 file | grep 8859 

 Смежные вопросы

  • Нет связанных вопросов^_^