蚂蚁复制任务破坏UTF-8符号



我有一个带有阿拉伯语翻译的.properties文件。我用它来替换html文件中的字符串。然而,当我开始复制任务时,它完全破坏了符号,我得到这样的东西:اUUزادات

知道是什么原因造成的,我怎么能解决它吗?

build . xml

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

我看到了一些可能的问题:

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

  • 应该使用copy任务的outputencoding属性。在Windows中,UTF-8不是默认编码。

我遇到了同样的问题,但是是图像。
在ant手册中,我发现了以下注释:
注意:如果在复制操作中使用过滤器,则应将复制限制为文本文件。复制操作会损坏二进制文件。无论筛选器是由筛选器任务隐式定义的,还是作为筛选器集显式提供给复制操作,都适用于此。参见编码说明。

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

亲切的问候,Marc

正如上面@Jean Waghetti所提到的,ANT希望这些文件是ISO-8859-1编码的。我贴了一个类似的关于汉字的堆栈溢出问题。

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

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

u0645u0631u062Du0628u0627 u0628u0627u0644u0639u0627u0644u0645

这是不理想的,因为它不是可怕的人类可读。我注意到eclipse在鼠标悬停时自动将其转换为

您可以添加一些代码将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>

最新更新