Ant复制任务会破坏UTF-8符号

时间:2013-05-22 09:22:11

标签: ant copy

我有一个.properties文件,翻译成阿拉伯语。我用它来替换html文件中的字符串。但是,当我启动复制任务时,它会完全破坏符号,我会得到这样的结果: اÙÙزادات

知道造成这种情况的原因以及我如何解决这个问题?

的build.xml

<target name="copyAndReplace">
   <copy todir="..." overwrite="yes" encoding="UTF-8">
      <fileset dir="..." includes="*.html"></fileset>
      <filterset>
         <filtersfile file="***.properties" />
      </filterset>
   </copy>
</target>

4 个答案:

答案 0 :(得分:2)

我看到一些可能的问题:

  • 在Java中,假定Properties个文件具有ISO-8859-1编码。即使你没有直接处理Java,ant也在读取属性文件。我在Vim和NetBeans编辑器中打开属性文件时遇到了这个问题。 Vim将其保存为UTF-8和ISO-8859-1中的NetBeans。

  • 您应该使用copy taskoutputencoding属性。在Windows中,UTF-8不是默认编码。

答案 1 :(得分:1)

我遇到了同样的问题,但有图片。
ant manual我发现了以下评论:
注意:如果在复制操作中使用过滤器,则应将副本限制为文本文件。复制操作将损坏二进制文件。无论过滤器是由过滤器任务隐式定义还是作为过滤器明确提供给复制操作,这都适用。请参阅编码说明。

也许这就是问题的根源。我需要自己检查这是否能解决我的问题。

亲切的问候, 马克

答案 2 :(得分:0)

如上面的@Jean Waghetti所述,ANT希望文件采用ISO-8859-1编码。我发布了一个类似stack overflow question的中文字符。

我发现的唯一解决方案是确保我的.properties文件是ISO-8859-1并且字符被转义。

例如مرحبابالعالم 将是:

\u0645\u0631\u062D\u0628\u0627 \u0628\u0627\u0644\u0639\u0627\u0644\u0645

这并不理想,因为它不是非常可读的。我注意到eclipse会在悬停时自动转换它。

答案 3 :(得分:0)

您可以添加一些代码以将utf-8属性转换为iso-8859-1属性并使用转换和转义属性

<project name="xyz" default="copyAndReplace">
    <property name="srcdir" value="src" />
    <property name="propdir" value="src" />
    <property name="tmpdir" value="tmp" />
    <target name="encodeProps">
        <script language="javascript">
            importPackage(java.io);
            importPackage(java.lang);
            var files = new java.io.File(propdir).listFiles();
            for (var i in files) {
                var f = files[i];
                if (!f.getName().endsWith(".properties")) continue;
                var io = new InputStreamReader(new FileInputStream(f), "utf-8");
                var out = new FileOutputStream(new File(tmpdir, f.getName()));
                do {
                    var c = io.read();
                    if (c == -1) break;
                    if (c &gt; 127) {
                        var s = Integer.toHexString(c);
                        s = new StringBuilder().append("\\u").append("0000".substring(s.length())).append(s).toString();
                        out.write(s.getBytes());
                    } else {
                        out.write(c);
                    }
                } while (true);
                io.close();
                out.close();
            }
        </script>
    </target>
    <target name="copyAndReplace" depends="encodeProps">
        <copy todir="dst" overwrite="yes" encoding="UTF-8" filtering="true">
            <fileset dir="${srcdir}" includes="*.html">
            </fileset>
            <filterset>
                <filtersfile file="${tmpdir}/c.properties" />
            </filterset>
        </copy>
    </target>
</project>