【问题标题】:Bulk convert cp1252 to utf-8 in Windows在 Windows 中将 cp1252 批量转换为 utf-8
【发布时间】:2012-03-30 01:32:17
【问题描述】:

所以, 我一直在尝试使用我在网上找到的提示和矩阵,特别是here,在 Windows 中将大型 Java 源代码树从 cp1252 转换为 UTF-8。问题是,我在 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

虽然手动执行单个表达式效果很好。

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

提前谢谢, 拉尔斯

【问题讨论】:

    标签: utf-8 cygwin cp1252


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      尽管 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 重定向会出现问题的根本问题仍未解决...

      【讨论】:

        【解决方案3】:

        我没有经常使用 Cygwin,但是我一直在使用 Iconv 的“本机”Windows 版本。这是我用来将子目录中的所有文件从 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(转到 ICONV_ERROR) )

        【讨论】:

          【解决方案4】:
          for f in `find . -type f`; do
              iconv -f cp1252 -t utf-8 $f > $f.converted
              mv $f.converted $f
          done
          

          【讨论】:

          • 谢谢,这按预期工作!但是,您知道为什么 find-exec 表达式不起作用吗?是否与输出重定向有关..?
          • 我不确定,但-exec 不是首选。从某处我了解到-exec 无法执行具有长参数的命令。我改用xargs
          猜你喜欢
          • 2014-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多