我在 <f:viewParam>
的帮助下将 queryString 中的值设置为 ManagedBean 的属性。 .如果我打印属性的值,它对于正常字符来说可以正常工作。
但是,当 queryString 包含重音字符时,在将值设置到 ManagedBean 的属性中后,如果我打印该属性的值,则重音字符
无法正常显示。
.xhtml 代码片段如下:
<f:metadata>
<f:viewParam id="requestString" name="requestString" value="#{aproveOrDenyController.requestString}" />
</f:metadata>
托管Bean:
@ManagedBean(name = "aproveOrDenyController")
@ViewScoped
public class AproveOrDenyController extends BaseWebController implements Serializable
{
private String requestString;
public final String getRequestString() {
return requestString;
}
public final void setRequestString(String requestString) {
this.requestString = requestString;
System.out.println(this.requestString);
}
}
如果查询字符串包含...&requestString=abcdefgh&.....
然后它打印 abcdefgh
正确。
但如果查询字符串包含 ...&requestString=SociétéGéniale&..
然后它打印 SociétéGéniale
。
但我想要SociétéGéniale
。
任何指针都会对我非常有帮助。
编辑-1 生成的错误:
19:52:49,594 ERROR [org.jboss.as.server] JBAS015956: Caught exception during boot: org.jboss.as.controller.persistence.ConfigurationPersistenceException: JBAS014676: Failed to parse configuration
at org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:141) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.ServerService.boot(ServerService.java:266) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:155) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_10]
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,5]
Message: JBAS014789: Unexpected element '{urn:jboss:domain:1.2}extensions' encountered
at org.jboss.as.controller.parsing.ParseUtils.unexpectedElement(ParseUtils.java:85) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readServerElement_1_1(StandaloneXml.java:351) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readElement(StandaloneXml.java:127) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readElement(StandaloneXml.java:100) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.staxmapper.XMLMapperImpl.processNested(XMLMapperImpl.java:110) [staxmapper-1.1.0.Final.jar:1.1.0.Final]
at org.jboss.staxmapper.XMLMapperImpl.parseDocument(XMLMapperImpl.java:69) [staxmapper-1.1.0.Final.jar:1.1.0.Final]
at org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:133) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
... 3 more
最佳答案
URI 查询字符串的解码由 servlet 容器(Tomcat、JBoss、Glassfish 等)管理。通常默认值为 ISO-8859-1。您需要将 servlet 容器中的查询字符串解码字符集配置为与 JSF/Facelets 用于编码响应和 POST 请求的字符集相同,默认情况下为 UTF-8。在您的情况下,查询字符串编码显然使用默认的 ISO-8859-1。 é
字符存在于 UTF-8 encoding两个字节 0xC3
和0xA9
其中每个依次代表 ISO-8859-1 encoding字符Ã
和©
,正是您所看到的字符。这证实了 ISO-8859-1 被错误地使用而不是 UTF-8。
由于您使用的是 JBoss AS,因此需要将以下条目添加到 <server>
JBoss 的/standalone/configuration/standalone.xml
,<extensions>
之间和<management>
在:
<system-properties>
<property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true" />
</system-properties>
这将指示 JBoss 使用 ServletRequest#getCharacterEncoding()
解码查询字符串,而不是 ISO-8859-1 的默认编码。如果这仍然不起作用(当您使用 PrimeFaces 时可能会发生这种情况),那么除了上述配置条目之外,您还需要使用 servlet 过滤器将字符编码显式设置为 UTF-8。这部分内容在 Unicode input retrieved via PrimeFaces input components become corrupted 的解决方案 1 中得到解答.
另一个可能的原因是输出目标中 System.out.println()
最终导致不使用 UTF-8 来呈现打印字符。这又与 JSF 和 servlet 容器完全无关。您也没有透露任何有关 System.out.println()
的背景信息。正在运行,所以这里也很难给出合适的答案。但如果是 Eclipse,那么您可以通过将“Window > Preferences > General > Workspace > Text File Encoding”设置为 UTF-8 来配置它。
另请参阅:
关于java - 无法从查询字符串中读取重音字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17672923/