Массовое преобразование cp1252 в utf-8 в Windows - PullRequest
4 голосов
/ 13 марта 2012

Итак, я пытался преобразовать большое дерево исходных текстов java из cp1252 в UTF-8 в Windows, используя подсказки и трикс, которые я нашел в Интернете, в частности здесь .Проблема в том, что я на Windows;Я не делаю VB;Cyvwin's iconv не использует переключатель -o.

Строка, которую я впервые попытался использовать:

find . -type f -print -exec iconv -f cp1252 -t utf-8 {} > {}.converted \; -exec mv {}.converted {} \;

Это создает файл {}.converted в рабочем каталоге, а второй-exec терпит неудачу по очевидным причинам.

Помещение кавычек вокруг выражения iconv:

find . -type f -print -exec 'iconv -f cp1252 -t utf-8 {} > {}.converted' \; -exec mv {}.converted {} \;

приводит к следующей ошибке:

find: `iconv -f cp1252 -t utf-8 ./java/dv/framework/activity/model/ActivitiesMediaViewImpl.java > ./java/dv/framework/activity/model/ActivitiesMediaViewImpl.java.converted': No such file or directory

при выполнении отдельных выраженийотлично работает вручную.

Я экспериментировал со случайными кавычками, но, похоже, ничего не работает, что мне не хватает?Почему это не сработает ..?

Спасибо заранее, Ларс

Ответы [ 3 ]

3 голосов
/ 13 марта 2012
for f in `find . -type f`; do
    iconv -f cp1252 -t utf-8 $f > $f.converted
    mv $f.converted $f
done
1 голос
/ 14 марта 2012

Хорошо, еще раз отвечая на мой собственный вопрос (это начинает становиться дурной привычкой ...)

Несмотря на то, что в решении Neevek нет ничего плохого, перфекционист во мне хочет найти find -execвыражение право.Обертывание оператора iconv в sh -c '...' делает свое дело:

find . -type f -print -exec sh -c 'iconv -f cp1252 -t utf-8 {} > {}.converted' \; -exec mv {}.converted {} \;

Тем не менее, основной вопрос о том, почему существует проблема с использованием перенаправления ввода-вывода в операторах find -exec, остается нерешенным ...

0 голосов
/ 13 марта 2012

Я не очень много использовал Cygwin, но есть «родная» версия Iconv для Windows, которую я использую все время. Вот выдержка из командного файла, который я использую для преобразования всех файлов в подкаталоге из кодировки HP-ROMAN8 в кодировку UTF-8 - поместив результат «./temp» под оригиналы:

@ set dir = original

@ set ICONV = "C: \ Program Files (x86) \ iconv-1.9.2.win32 \ bin \ iconv"

если EXIST. \% Dir% \ temp ( стереть. \% dir% \ temp *. * / Q @if ERRORLEVEL 1 (@echo Невозможно удалить все файлы из подкаталога «temp» @goto THE_END ) ) еще ( mkdir. \% dir% \ temp @if ERRORLEVEL 1 (@echo Невозможно создать подкаталог temp) @goto THE_END ) )

для %% f IN (./%dir%/*.xml) do ( % ICONV% -f HP-ROMAN8 -t UTF-8 "./%dir%/%%f"> "./%dir%/temp/%%f" если ОШИБКА 1 (перейти к ICONV_ERROR) )

...