如何在 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.properties
或 web.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 模块,或者只是在每次更改时手动使用它)。
我现在有一个最美妙的任务,所有程序员的梦想。这里有一个大约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.properties
或web.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 模块,或者只是在每次更改时手动使用它)。