Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ant中加载非ascii属性文件_Ant - Fatal编程技术网

如何在ant中加载非ascii属性文件

如何在ant中加载非ascii属性文件,ant,Ant,假设我有一个属性文件test.properties,它使用utf-8保存 testOne=测试 我正在使用以下ant脚本加载它并将其回显到另一个文件: <loadproperties srcFile="test.properties" encoding="utf-8"/> <echo encoding="utf-8" file="text.txt">${testOne}</echo> 我的脚本出了什么问题?我找到了解决办法,但我仍然不明白为什么Org

假设我有一个属性文件test.properties,它使用utf-8保存

 testOne=测试
我正在使用以下ant脚本加载它并将其回显到另一个文件:

 <loadproperties srcFile="test.properties" encoding="utf-8"/>
 <echo encoding="utf-8" file="text.txt">${testOne}</echo>

我的脚本出了什么问题?

我找到了解决办法,但我仍然不明白为什么OrganOne不起作用:

<native2ascii src="." dest=".">
<mapper type="glob" from="test.properties" to="testASCII.properties"/>
</native2ascii>
<loadproperties srcFile="testASCII.properties"/>

然后,回声按预期工作

我不知道为什么loadproperties中的编码不起作用


有人能解释一下吗?

我找到了一个解决办法,但我仍然不明白为什么OrganOne不起作用:

<native2ascii src="." dest=".">
<mapper type="glob" from="test.properties" to="testASCII.properties"/>
</native2ascii>
<loadproperties srcFile="testASCII.properties"/>

然后,回声按预期工作

我不知道为什么loadproperties中的编码不起作用

有人能解释一下吗?

试着这样做:

<loadproperties srcfile="non_ascii_property.properties">
  <filterchain>
    <escapeunicode/>
  </filterchain>
</loadproperties>

显然,InputStreamReader使用ISO Latin-1字符集,这会杀死非ascii字符。我遇到了同样的问题,是阿拉伯语。

这样试试:

<loadproperties srcfile="non_ascii_property.properties">
  <filterchain>
    <escapeunicode/>
  </filterchain>
</loadproperties>


显然,InputStreamReader使用ISO Latin-1字符集,这会杀死非ascii字符。我遇到了同一期的阿拉伯文版。

您使用的是什么编辑器,您使用的是什么平台

生成的属性文件实际上可能很好,但用于检查它的编辑器可能无法查看它。例如,在我的Mac上,
VIM
命令行编辑器可以查看它(这让我感到惊讶),但在Eclipse中,它看起来是这样的:

testOne=������
如果您使用的是Unix/Linux/Mac,请尝试使用转储生成的文件,并检查实际的十六进制代码,看看它应该是什么

例如,我复制了您的属性文件,并在Mac上运行了
od

$ od -t x1 -t c test.property
0000000    74  65  73  74  4f  6e  65  3d  e6  b5  8b  e8  af  95  0a    
           t   e   s   t   O   n   e   =  测  **  **  试  **  **  \n

在这里我可以看到
36 b5 8b
e8 af 95
,这是这两个字符的正确UTF-8表示形式。(或者,至少我这么认为。它正确地显示在角色查看器Mac OS X面板中)。

您使用的是什么编辑器以及您使用的是什么平台

生成的属性文件实际上可能很好,但用于检查它的编辑器可能无法查看它。例如,在我的Mac上,
VIM
命令行编辑器可以查看它(这让我感到惊讶),但在Eclipse中,它看起来是这样的:

testOne=������
如果您使用的是Unix/Linux/Mac,请尝试使用转储生成的文件,并检查实际的十六进制代码,看看它应该是什么

例如,我复制了您的属性文件,并在Mac上运行了
od

$ od -t x1 -t c test.property
0000000    74  65  73  74  4f  6e  65  3d  e6  b5  8b  e8  af  95  0a    
           t   e   s   t   O   n   e   =  测  **  **  试  **  **  \n

在这里我可以看到
36 b5 8b
e8 af 95
,这是这两个字符的正确UTF-8表示形式。(或者,至少我这么认为。它正确地显示在字符查看器Mac OS X面板中)。

David W.的评论指出了正确的答案:

Java属性文件必须用
ISO-8859-1
编码:

但是像
\u6d4b
这样的Unicode转义序列可以/必须用于编码其中的Unicode字符


工具/ANT目标,如
,从本机维护的文件生成ascii编码的文件,可以在这里提供帮助

David W.的评论指出了正确的答案:

Java属性文件必须用
ISO-8859-1
编码:

但是像
\u6d4b
这样的Unicode转义序列可以/必须用于编码其中的Unicode字符

工具/ANT目标,如
,从本机维护的文件生成ascii编码的文件,可以在这里提供帮助

同时使用“编码”和“escapeunicode”。很好

<loadproperties srcfile="${your.properties.file}" encoding="UTF-8">
    <filterchain>
        <escapeunicode />
    </filterchain>
</loadproperties>

同时使用“编码”和“转义码”。很好

<loadproperties srcfile="${your.properties.file}" encoding="UTF-8">
    <filterchain>
        <escapeunicode />
    </filterchain>
</loadproperties>

您可以编写自己的任务,从操作系统的默认java字符编码读取属性(我的是utf-8),而不是将属性文件转换为不可读的unicode转义ASCII文件(由只读写英语的人设计)。下面介绍如何将Property.java从Ant的源代码复制和修改到您自己的包(例如org.my.Ant)中。我使用了Ant1.10.1

从此处以您选择的格式下载Ant的源代码:

将src/main/org/apache/tools/ant/taskdefs/Property.java复制到org/my/ant/Property.java中您自己的项目(例如新的java项目)

替换:

package org.apache.tools.ant.taskdefs;
props.load(is);
与:

修复包更改所需的任何导入。我只需要补充一点:

import org.apache.tools.ant.taskdefs.Execute;
在方法中:

loadProperties(Properties props, InputStream is, boolean isXml)
替换:

package org.apache.tools.ant.taskdefs;
props.load(is);
与:

在项目的resources文件夹(可能与源文件夹相同)中,添加文件org/my/ant/antlib.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<antlib>

<taskdef name="property" classname="org.my.ant.Property"/>

</antlib>

您可以编写自己的任务,从操作系统的默认java字符编码读取属性(我的是utf-8),而不是将属性文件转换为不可读的unicode转义ASCII文件(由只读写英语的人设计)。下面介绍如何将Property.java从Ant的源代码复制和修改到您自己的包(例如org.my.Ant)中。我使用了Ant1.10.1

从此处以您选择的格式下载Ant的源代码:

将src/main/org/apache/tools/ant/taskdefs/Property.java复制到org/my/ant/Property.java中您自己的项目(例如新的java项目)

替换:

package org.apache.tools.ant.taskdefs;
props.load(is);
与:

修复包更改所需的任何导入。我只需要补充一点:

import org.apache.tools.ant.taskdefs.Execute;
在方法中:

loadProperties(Properties props, InputStream is, boolean isXml)
替换:

package org.apache.tools.ant.taskdefs;
props.load(is);
与:

在项目的resources文件夹(可能与源文件夹相同)中,添加文件org/my/ant/antlib.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<antlib>

<taskdef name="property" classname="org.my.ant.Property"/>

</antlib>

您使用的是什么编辑器?您使用的是什么平台?很可能您的编辑器没有使用UTF-8。您使用的是什么编辑器以及您使用的是什么平台?很可能您的编辑器没有使用UTF-8。我认为这是Ant中的一个bug。s