如何在struts1 taglib中强制执行utf8?

时间:2017-08-22 12:48:31

标签: java tomcat utf-8 struts struts-1

我现在已经完成了一项最精彩的任务,也是所有程序员的梦想。这里有一个大约有15年历史的软件,我只需修复一些错误"在里面。 32位java6,tomcat6,非unicode源代码,ant构建系统,以及我只能"喜欢"。

注意,我只对.war文件有效,因此服务器端设置不行。

1 个答案:

答案 0 :(得分:4)

您的主要问题可能出在<bean:message>标记中,但其他标记也可能存在问题。

Java核心支持utf8,因为它处于早期的alpha天,但不幸的是,.properties文件的处理存在异常。 JDK API调用始终将这些文件解释为iso8859-1。

Struts1标记库使用由密钥寻址的i18n字符串,存储在*.properties个文件中。挖掘一下struts1源代码,我发现了这些:

  • 它使用JDK调用读取.properties个文件,因此始终位于iso8859-1中。它深深地硬连线到代码中,没有办法改变它。
  • struts 1中有一个 locale localeKey 参数,可以通过各种system.propertiesweb.xml设置进​​行更改{ {1}}仍然会被视为iso8859-1。此locale / localekey仅为实际解释的属性文件添加额外的扩展名。
  • 没有办法改变它,没有分支/复制struts1的相应部分,强制执行一些非标准的东西到JDK属性标题中来强制执行它们的约定的标准。在这种遗物代码的情况下,这不是一件非常方便的事情。

虽然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模块,或者只是每次手动更改它)。