在使用struts的资源文件,如果资源文件中有中文字符,直接使用就是乱码。我们一般是把资源文件用java的native2ascii.exe命令把资源文件中字符全部转换为Ascii码,也有通过自己实现过滤器来转换。
为什么struts资源文件不支持中文呢?查看struts原码:org.apache.struts.util.PropertyMessageResources类中的244和259行可以发现,它是调用的java.util.Properties来读取资源文件的。那这么看来struts不支持中文的原因应该在java.util.Properties上面。
java.util.Properties是通过InputStreamReader来把InputStream适配为Reader类的。InputStream是针对byte(8位),而Reader是针对char(16位),要支持中文也必须得用16位的Reader,既然java.util.Properties已经通过InputStreamReader来把InputStream适配为Reader类,那为什么还是不支持中文呢?查看java.util.Properties类的load()方法就一切都明白了,java.util.Properties的189行:
BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "8859_1"));
原来它在构造new InputStreamReader时使用了"8859_1"编码,把中文用"8859_1"编码来处理当然会是乱码。如果此处在构造时指定"GBK"编码,或不指定让它采用系统的本地编码,就不会出现乱码问题了,真纳闷,为什么java工程师不让它自己按照系统的本地编码,而要指定"8859-1"呢?可能是是因为他认为8859-1在满足大多数用户的需求和节省空间上是性价比最高的吧。对于我们自己使用的中文配置文件,完全可以自己来实现。
BufferedReader in = new BufferedReader(new InputStreamReader(inStream));
为何struts不支持中文
最新推荐文章于 2019-12-12 14:16:41 发布