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

标签 java tomcat utf-8 struts struts-1

我现在有一个最美妙的任务,所有程序员的梦想。这里有一个大约有 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中有一个localelocaleKey参数,可以通过各种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/

相关文章:

java-stream-List of Long to list in one line

java - 访问 Web 服务时出现 NoClassDefFoundError

tomcat - intellij tomcat配置端口号

python - 如何在 python 中将 url 编码的字符串转换为正确的 unicode 字符串

java - 如何在 Android 9 上保持 UTF-8 的向后兼容性?

java - 如何在 Spring 中创建多 Web 模块应用程序?

java - 关于静态方法和调用堆栈的问题

java - 适当的 Tomcat 5.5 启动参数来调整 JVM 以满足极高的需求、大堆 Web 应用程序?

python utf-8问题

java - 为什么在 HttpServletRequest 中没有 getCookie(String) 方法?