我有一个带有阿拉伯语翻译的.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 > 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>