如何在 struts1 标签库中强制使用 utf8?

How can I enforce utf8 in the struts1 taglib?

我现在有一个最美妙的任务,所有程序员的梦想。这里有一个大约15年的software,我只需要在其中修复"some bugs"。 32 位 java6、tomcat6、非 unicode 源代码、ant 构建系统以及我只能 "like".

的一切

注意,我只对 .war 文件有权限,因此服务器端设置不正确。

您的主要问题可能出在 <bean:message> 标签中,尽管其他标签也可能有问题。

Java 内核从早期的 alpha 时代就支持 utf8,但不幸的是在处理 .properties 文件时出现异常。 JDK API 调用总是将这些文件解释为 iso8859-1。

Struts1 标签库使用由键寻址的 i18n 字符串,存储在 *.properties 文件中。深入研究 struts1 来源,我发现了这些:

  • 它通过 JDK 调用读取 .properties 文件,因此始终在 iso8859-1 中。它已深深嵌入代码中,无法更改。
  • 在struts1里面有个locale或者localeKey参数,可以通过各种system.propertiesweb.xml 设置,.properties 仍将始终读取为 iso8859-1。 locale/localekey 只是为实际解释的属性文件添加了一个额外的扩展名。
  • 没有办法改变它,没有 forking/duplicating struts1、 的相应部分强制执行某些 non-standard 东西JDK 属性 headers 将标准强制执行到他们的约定中。在这样的遗迹码的情况下,并不是一件很方便的事情。

尽管 struts 和您系统的其他部分(例如 JSP parser/interpreter) 已经进行了一些转换需要,因此如果您的 JSP 页面设置正确(meta headers 等),此 iso8859-1 文本 转换为 utf8。

此外,属性 reader 使用了一个类似硬连线、不可禁用的功能,对 utf8 有一点支持。它接受 \uC0DE 形式的 utf8 字符。因此,在 \u\U (不区分大小写)之后,您可以给出一个 16 位的十六进制值,其中 可以是 和 unicode 字符。

必须始终为 16 位长,不允许其他长度,但这些长度已经不区分大小写。

因此,

my.property.key=árvíztűrő tükörfúrógép

...编码为utf8,将不起作用,它将被解释为iso8859-1。

您可以将此字符串输入为 iso8859-1。它不能工作,因为一些口音没有 iso8859-1 映射,即它们不存在于 iso8859-1 编码中。

但是,如果将其编码为上述格式:

my.property.key=\u00E1rv\u00EDzt\u0171r\u0151 t\u00FCk\u00F6rf\u00FAr\u00F3g\u00E9p

那么是的,它会起作用!

为了进行这种转换,Sun 有一个 native2ascii 工具,但今天无法使用。您必须从网上的某个存档中挖掘这个工具,或者找到一个不同的工具。

在 Linux 上,有一个名为 uni2ascii 的工具(在 debian-based 发行版上,您可以使用 apt-get install uni2ascii 安装它),它可以进行正确的转换。正确的参数是:

uni2ascii -a U myfile.properties

结果输出到标准输出。

这取决于你,你如何将它集成到你的构建系统中(一些 ant/maven exec 模块,或者只是在每次更改时手动使用它)。