3

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

知道是什么原因造成的,我该如何解决?

构建.xml

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

4 回答 4

2

我看到一些可能的问题:

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

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

于 2013-05-22T16:43:35.460 回答
1

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

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

亲切的问候,马克

于 2013-06-03T12:17:06.670 回答
0

正如上面@Jean Waghetti 所提到的,ANT 期望文件采用 ISO-8859-1 编码。我发布了一个类似的中文字符堆栈溢出问题

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

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

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

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

于 2014-10-22T17:59:47.137 回答
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>
于 2016-01-19T11:29:37.787 回答