在Windows中将cp1252批量转换为utf-8

时间:2012-03-13 16:00:03

标签: utf-8 cygwin cp1252

所以, 我一直试图在Windows中将大型java源代码树从cp1252转换为UTF-8,使用我在网上发现的提示和解决方案,特别是here。问题是,我在Windows上;我不做VB; Cygwin的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

尽管手动执行各个表达式非常有效。

我已经尝试过随机引用,但似乎没有任何效果,我错过了什么?为什么它不会起作用..?

Thanx提前, 拉斯

4 个答案:

答案 0 :(得分:3)

for f in `find . -type f`; do
    iconv -f cp1252 -t utf-8 $f > $f.converted
    mv $f.converted $f
done

答案 1 :(得分:1)

好吧,再次回答我自己的问题(这已经开始成为一个坏习惯......)

尽管Neevek的解决方案没有任何问题,但我的完美主义者希望找到-exec表达正确。在sh -c '...'中包装iconv语句可以解决问题:

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

但是,在查找-exec语句中使用i / o重定向时出现问题的根本问题仍未得到解决......

答案 2 :(得分:0)

我没有使用Cygwin,但是我一直使用的是“本机”Windows版本的Iconv。以下是我用于将子目录中的所有文件从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     )   )

for %% f IN(./%dir%/*.xml)do(      %ICONV%-f HP-ROMAN8 -t UTF-8“./%dir%/%%f”> “./%dir%/temp/%%f”      如果ERRORLEVEL 1(转到ICONV_ERROR)   )

答案 3 :(得分:0)

第一次尝试中的错误是在查找开始之前外壳对重定向运算符'>'进行了评估。

第二次尝试中的错误是单引号之间的文本被解释为将由find执行的命令的名称,但是不存在。

在您的工作解决方案中,find要执行的第一个命令是一个子外壳,并且选项用单引号引起来,因此它们不是由外壳解释而是由子外壳解释。