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

4

我一直在尝试将一个大型Java源代码树从cp1252转换为UTF-8编码,在Windows下使用我在网上找到的技巧,特别是这里。问题是,我使用的是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

虽然手动执行单个表达式可以完美运行。

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

先感谢您的帮助, Lars

4个回答

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

谢谢,这个正常工作了!但是,你有没有想法为什么查找执行表达式不起作用?是和输出重定向有关吗? - Larsing
我不确定,但是“-exec”不被推荐使用。从某个地方我了解到,“-exec”不能执行具有长参数的命令。我使用“xargs”代替它。 - neevek

1

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

虽然 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语句中使用i/o重定向会出现问题的根本问题仍未解决...


0

第一次尝试中的错误是重定向运算符'>'在find开始之前由shell评估。

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

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


0

我没有使用过Cygwin,但我经常使用本地版本的Iconv来进行编码转换。以下是我用来将子目录中所有文件从HP-ROMAN8编码转换为UTF-8编码的批处理文件摘录 - 将结果“./temp”放在原始文件下:

@set dir=original

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

如果存在.\%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),执行以下操作:( %ICONV% -f HP-ROMAN8 -t UTF-8 "./%dir%/%%f" > "./%dir%/temp/%%f" 如果ERRORLEVEL 1 (goto ICONV_ERROR) )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接