一个 Struts2 的国际化定位的问题,用来显示中国汉字...
属性文件存储用户名,密码信息,并以中文字符提交。此属性文件以UTF-8格式创建的,但内容不使用 native2ascii 编码。
让我们试着通过一些UI标签,来显示中国汉字。查看页面声明为UTF-8格式的HTML元标记来显示。
...
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
...
<s:form action="validateUser">
<s:textfield key="global.username" name="username"/>
<s:password key="global.password" name="password"/>
<s:submit key="global.submit" name="submit" />
<div>Testing 1 : <s:property value="getText('global.username')" /></div>
<div>Testing 2 : <s:text name="global.password" /></div></br/>
</s:form>
...
<s:url id="localezhCN" namespace="/" action="locale" >
<s:param name="request_locale" >zh_CN</s:param>
</s:url>
...
<s:a href="%{localezhCN}" >Chinese</s:a>
...
结果
令人惊奇的是,以下三个UI标签都能够正确地显示中国消息
<s:textfield key="global.username" name="username"/>
<s:password key="global.password" name="password"/>
Testing 2 : <s:text name="global.password" />
然而,“s:submit” 和 “getText()” 却无法显示呢?据Java的国际化文档,要使用资源包正确显示特殊字符,则必须用 native2ascii 工具进行处理。
深入到 TextProvider.getText()的源代码后,它使用的资源 bundle.getString()来从资源包检索的消息,所以不正确的消息是合理的。但是,为什么“s:text“, “s:textfield” 和 “s:password” 能够正确显示了中文的消息,为什么“s:submit”会失败?在有太多的问题,让我们看看示例2...
这一次,属性文件使用native2ascii工具处理中国汉字的编码正确。
结果如下所示:
其结果是完全逆转,现在 “s:submit” 和 “getText()” 是能够正确地显示它,但其他UI组件失败。 这里是按预期方式工作的,因为在Struts 2推荐使用getText(),以显示国际化或本地化的消息。问题是,为什么“s:submit”会不同呢?
这里有几个问题:
许多文章和教程使用以下方法来显示资源包的消息:
<s:text name="global.username"/>
<s:property value="getText('global.username')"/>
然而,这仅适用于英国或一些“英语状(欧洲)” 的字符,如法文,德文。但对中文或日文,这两种方法将返回完全不同的输出。真的不知道Struts2的本地化该怎么办了。
问题是在HTML meta标签,
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
在Struts1,上述meta标签必须正确显示UTF-8的数据,但这在 Struts2 是有问题的。
在Struts2,meta标签不起作用,我们应该把 <%@ page contentType=”text/html;charset=UTF-8″ %>标签放在页面的第一行。例如下面的代码片断:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
...
结果显示如下:
所有的中文消息正确显示。
下载代码(globalresource) – http://pan.baidu.com/s/1mgzt3dQ