我有一个项目,一切都是UTF-8。我使用Properties.load(Reader)方法读取此编码中的属性文件。但是现在,我需要使项目与Java 1.5兼容,并且Java 1.5中不存在所提到的方法。只有一个load方法将InputStream作为参数,假设它在ISO-8859-1中。
有没有简单的方法可以使我的项目1.5兼容而无需将所有.properties文件更改为ISO-8859-1?我真的不想在我的项目中混合编码(编码已经是一次一个时间下沉,更不用说混合时)或者将我的所有项目都改为ISO-8859-1。
使用“一种简单的方法”,我的意思是“无需从头开始创建自定义属性类”。
答案 0 :(得分:3)
您可以使用xml-properties吗?据我所知,spec .properties文件应该在ISO-8859-1
,如果你想要其他字符,应该使用native2ascii
工具引用它们。
答案 1 :(得分:2)
可能适用于这种情况的一种策略如下:
Reader
的字节读入ByteArrayOutputStream
。toByteArray()
byte[]
构建ByteArrayInputStream
Properties.load(InputStream)
ByteArrayInputStream
醇>
正如所指出的,上面的实际上未能将字符集从UTF-8转换为ISO-8859-1。要解决这个问题,请进行调整。
BAOS填写后,而不是拨打toByteArray()
..
toString("ISO-8859-1")
以获取ISO-8859-1编码String
。然后看.. .. String.getBytes()
以获取byte[]
答案 2 :(得分:1)
你可以做的是打开一个使用BufferedReader读取数据的线程,然后将数据写出到PipedOutputStream,然后通过加载使用的PipedInputStream进行链接。
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(pos);
ReaderRunnable reader = new ReaderRunnable(pos, new File("utfproperty.properties"));
Thread t = new Thread(reader);
t.start();
properties.load(pis);
t.join();
BufferedReader将一次读取一个字符的数据,如果它检测到的字符数据不在US-ASCII(即低7位)范围内,则写入“\ u”+字符代码进入PipedOutputStream。
ReaderRunnable将是一个类似于:
的类public class ReaderRunnable implements Runnable {
public ReaderRunnable(OutputStream os, File f) {
this.os = os;
this.f = f;
}
private final OutputStream os;
private final File f;
public void run() {
// open file
// read file, escape any non US-ASCII characters
}
}
现在写完所有我认为有人应该先解决这个问题并解决它之后,找到这些东西的最佳位置是Apache Commons。幸运的是,他们在那里实施了。
https://commons.apache.org/io/apidocs/org/apache/commons/io/input/ReaderInputStream.html
Apache的实现并非没有缺陷。您的输入文件即使是UTF-8也必须只包含ISO-8859-1字符集中的字符。我上面提供的设计可以处理这种情况。
答案 3 :(得分:1)
我个人在我的项目中做的是将我的属性保存在带有扩展名.uproperties的UTF-8文件中,并在构建时使用native2ascii.exe
将它们转换为ISO到.properties文件。这允许我以UTF-8维护我的属性,Ant脚本为我做其他所有事情。
答案 4 :(得分:1)
根据您的构建引擎,您可以\ uXXXX将属性转义到构建目标目录。 Maven可以通过 native2ascii-maven-plugin 过滤它们。
答案 5 :(得分:-1)
我刚刚体验到的是,使所有.java文件也是UTF-8编码类型(不仅是存储UTF-8字符的属性文件)。这种方式也不需要用于InputStreamReader。另外,请确保编译为UTF-8编码。
这对我有用,没有添加任何UTF-8参数。
要测试这个,请在eclipse中编写一个简单的存根程序,并通过转到该文件的属性和资源部分来更改该java文件的格式,以设置UTF-8编码格式。