首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在utf8标记库中强制执行struts1?

如何在utf8标记库中强制执行struts1?
EN

Stack Overflow用户
提问于 2017-08-22 12:48:30
回答 1查看 581关注 0票数 1

我现在有一个最棒的任务,所有程序员的梦想。这里有一个大约有15年历史的软件,我只需要修复其中的“一些bug”。32位java6,tomcat6,非unicode源代码,蚂蚁构建系统,以及一切我只能“喜欢”的东西。

请注意,我只有一个.war文件的权力,因此服务器端设置是不好的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-22 12:48:30

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

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

Struts1标记使用按键寻址的i18n字符串,存储在*.properties文件中。在深入了解struts1源代码之后,我发现了以下内容:

  • 它使用JDK调用读取.properties文件,因此总是在in 8859-1中。它深深地连接到代码中,没有办法改变它。
  • struts 1中有一个locale或localeKey参数,可以通过各种system.propertiesweb.xml设置进行更改,.properties仍将被读取为is 8859-1。此locale/localekey只为实际解释的属性文件添加额外的扩展名。
  • 如果不对struts1的相应部分进行分叉/复制,并在JDK报头中强制执行一些非标准的东西,就无法更改它,从而使标准符合它们的约定。对于这样的遗物代码来说,这不是一件很方便的事情。

尽管struts和系统的其他部分(例如,JSP解析器/解释器)已经根据需要进行了一些转换,因此,如果正确设置了JSP页面(元头等),则该if 8859-1文本将被转换为utf8。

此外,属性读取器使用一个类似硬连接的、非禁用的特性来对utf8提供一些支持。它接受表单utf8中的\uC0DE字符。因此,在\u\U (大小写不敏感)之后,您可以给出一个16位的十六进制值,这个值可以是和unicode字符。

它必须总是16位长,其他长度是不允许的,但这些已经是不区分大小写的。

因此,

代码语言:javascript
复制
my.property.key=árvíztűrő tükörfúrógép

...encoded作为utf8,不能工作,它将被解释为it 8859-1。

您可以将此字符串输入为You 8859-1。它不能工作,因为有些重音没有It 8859-1映射,也就是说,它们在It 8859-1编码中不存在。

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

代码语言:javascript
复制
my.property.key=\u00E1rv\u00EDzt\u0171r\u0151 t\u00FCk\u00F6rf\u00FAr\u00F3g\u00E9p

那是的,它会起作用的!

为了完成这一转换,Sun有一个native2ascii工具,这在今天是无法实现的。你必须从网上的一些档案中挖掘这个工具,或者找一个不同的工具。

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

代码语言:javascript
复制
uni2ascii -a U myfile.properties

结果是结果出来了。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45818123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档