我现在已经完成了一项最精彩的任务,也是所有程序员的梦想。这里有一个大约有15年历史的软件,我只需修复一些错误"在里面。 32位java6,tomcat6,非unicode源代码,ant构建系统,以及我只能"喜欢"。
注意,我只对.war文件有效,因此服务器端设置不行。
答案 0 :(得分:4)
您的主要问题可能出在<bean:message>
标记中,但其他标记也可能存在问题。
Java核心支持utf8,因为它处于早期的alpha天,但不幸的是,.properties
文件的处理存在异常。 JDK API调用始终将这些文件解释为iso8859-1。
Struts1标记库使用由密钥寻址的i18n字符串,存储在*.properties
个文件中。挖掘一下struts1源代码,我发现了这些:
.properties
个文件,因此始终位于iso8859-1中。它深深地硬连线到代码中,没有办法改变它。system.properties
或web.xml
设置进行更改{ {1}}仍然会被视为iso8859-1。此locale / localekey仅为实际解释的属性文件添加额外的扩展名。虽然struts和你系统的其他部分(例如,JSP解析器/解释器)已经已经根据需要进行了一些转换,所以这个iso8859-1文本将
此外,属性读者使用 - 类似硬连线,不可用的 - 功能,以获得对utf8的一点支持。它接受.properties
形式的utf8字符。因此,在\uC0DE
或\u
(不区分大小写)之后,您可以给出一个16位的hexa值,可以是和unicode字符。
它必须始终为16位长,不允许使用其他长度,但这些长度已经不区分大小写。
因此,
\U
...编码为utf8,不起作用,它将被解释为iso8859-1。
您可以输入此字符串作为iso8859-1。它无法工作,因为某些重音符号没有iso8859-1映射,即它们在iso8859-1编码中不存在。
但是,如果您将其编码为上述格式:
my.property.key=árvíztűrő tükörfúrógép
然后是的,它会起作用!
要进行此转换,Sun有一个my.property.key=\u00E1rv\u00EDzt\u0171r\u0151 t\u00FCk\u00F6rf\u00FAr\u00F3g\u00E9p
工具,今天无法访问。你必须从网上的一些档案中挖掘这个工具,或者找一个不同的工具。
在Linux上,有一个名为native2ascii
的工具(基于debian的发行版,您可以使用uni2ascii
安装它),它可以进行正确的转换。正确的参数是:
apt-get install uni2ascii
结果转到stdout。
由您决定,如何将它集成到您的构建系统(一些ant / maven exec模块,或者只是每次手动更改它)。