Я скопировал определенные файлы с машины Windows на машину Linux. Так весь закодированный Windows (окна 1252) файлы должны быть преобразованы в UTF-8. Файлы, которые уже находятся в UTF-8, не должны быть изменены. Я планирую использовать recode
утилита для этого. Как я могу указать что recode
утилита должна только преобразовать окна 1 252 закодированных файла а не файлы UTF-8?
Использование в качестве примера перекода:
recode windows-1252.. myfile.txt
Это преобразовало бы myfile.txt
из окон 1252 к UTF-8. Прежде, чем сделать это, я хотел бы знать это myfile.txt
на самом деле окна закодированный 1252 и не закодированный UTF-8. Иначе я полагаю, что это повредило бы файл.
Как можно ожидать от перекодирования, чтобы узнать, что файл является файлом Windows-1252? Теоретически я считаю, что любой файл является допустимым файлом Windows-1252, поскольку он отображает каждый возможный байт на символ.
Конечно, есть характеристики, которые убедительно предполагают , что это UTF-8 - если он начинается, например, со спецификации UTF-8 - но они не будут окончательными.
Один из вариантов - сначала определить, действительно ли это полностью действительный файл UTF-8, я полагаю ... опять же, это только наводит на размышления.
Я не знаком с самим инструментом перекодирования, но вы, возможно, захотите узнать, может ли он перекодировать файл из и в той же кодировке - если вы сделаете это с недопустимым файлом (т. Е. тот, который содержит недопустимые последовательности байтов UTF-8), он вполне может преобразовать недопустимые последовательности в вопросительные знаки или что-то подобное. В этот момент вы можете определить, что файл является допустимым UTF-8, перекодировав его в UTF-8 и проверив, идентичны ли вход и выход.
В качестве альтернативы, сделайте это программно, а не с помощью утилиты перекодирования - это было бы довольно просто, например, в C #.
Просто повторюсь: все это эвристика. Если вы действительно не знаете кодировку файла, ничто не скажет вам это со 100% точностью.
Нет общего способа определить, закодирован ли файл в определенной кодировке. Помните, что кодировка - это не более чем "соглашение" о том, как биты в файле должны быть привязаны к символам.
Если вы не знаете, какие из ваших файлов на самом деле уже закодированы в UTF-8, а какие - в windows-1252, вам придется просмотреть все файлы и выяснить это самому. В худшем случае это может означать, что Вы должны открыть каждую из них в одной из двух кодировок и посмотреть, "выглядят" ли они правильно - т.е. все символы отображаются правильно. Конечно, для этого можно использовать инструментальную поддержку, Например, если Вы точно знаете, что некоторые символы содержатся в файлах, которые имеют другое отображение в windows-1252 vs. UTF-8, то Вы можете смазать их после прогона файлов через 'iconv', как упоминал Сева Акекекеев.
Другой счастливый случай для Вас, если Вы знаете, что файлы на самом деле содержат только символы, которые одинаково закодированы как в UTF-8, так и в windows-1252. В таком случае, конечно, вы уже закончили
.Используйте команду iconv .
Чтобы убедиться, что файл находится в Windows-1252, откройте его в Блокноте (в Windows), затем нажмите «Сохранить как». Блокнот предлагает текущую кодировку по умолчанию; если это Windows-1252 (или любая 1-байтовая кодовая страница, если на то пошло), будет написано «ANSI».