我现在有一个最美妙的任务,所有程序员的梦想。这里有一个大约有 15 年历史的软件,我只需要修复其中的“一些错误”。 32位java6、tomcat6、非unicode源码、ant构建系统,以及我只能“喜欢”的一切。
请注意,我只能处理 .war 文件,因此服务器端设置不正确。
最佳答案
您的主要问题可能在于 <bean:message>
标签,尽管其他标签也可能有问题。
Java 核心从早期的 alpha 时代就支持 utf8,但不幸的是在处理 .properties
时出现异常。文件。 JDK API 调用始终将这些文件解释为 iso8859-1。
Struts1 标签库使用由键寻址的 i18n 字符串,存储在 *.properties
中文件。深入研究 struts1 源代码,我发现了这些:
- 它显示
.properties
带有 JDK 调用的文件,因此总是在 iso8859-1 中。它深深嵌入代码中,无法更改。 - struts 1中有一个locale或localeKey参数,可以通过各种
system.properties
来改变或web.xml
设置,.properties
仍将始终读取为 iso8859-1。此语言环境/语言环境 key 仅向实际解释的属性文件添加额外的扩展名。 - 没有办法改变它,除非 fork /复制 struts1 的相应部分,和将一些非标准的东西强制执行到 JDK 属性 header 中以将标准强制执行到它们的约定中。对于这样的遗留代码,并不是一件很方便的事情。
尽管 struts 和系统的其他部分(例如,JSP 解析器/解释器) 已经根据需要进行了一些转换,所以这个 iso8859-1 文本将 转换为 utf8,如果您的 JSP 页面设置正确(元标题等)。
此外,属性读取器使用了一个类似硬连线、不可禁用的功能,以对 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
那么是的,它将起作用!
为了进行这种转换,太阳有一个 native2ascii
工具,今天无法访问。您必须从网上的某个存档中挖掘这个工具,或者找到一个不同的工具。
在 Linux 上,有一个名为 uni2ascii
的工具(在基于 debian 的发行版上,您可以使用 apt-get install uni2ascii
安装它),它会进行正确的转换。正确的参数是:
uni2ascii -a U myfile.properties
结果输出到标准输出。
这取决于你,你如何将它集成到你的构建系统中(一些 ant/maven exec 模块,或者只是在每次更改时手动使用它)。
关于java - 如何在 struts1 标签库中强制使用 utf8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45818123/