无法从查询字符串中读取重音字符

时间:2013-07-16 09:33:23

标签: java jsf-2 character-encoding query-string viewparams

我在<f:viewParam>的帮助下将queryString的值设置为managedBean的属性。如果我打印属性的值,它对正常字符正常工作。 但是当queryString包含重音字符时,在将值设置为managedBean的属性后,如果我打印该属性的值,则重音字符 没有正确显示。

.xhtml代码段如下:

<f:metadata>
<f:viewParam id="requestString" name="requestString" value="#{aproveOrDenyController.requestString}" />
</f:metadata>

ManagedBean:

@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);
}
}

如果查询字符串包含...&amp; requestString = abcdefgh&amp; ..... 然后它正确打印abcdefgh。 但是如果查询字符串包含...&amp; requestString =SociétéGéniale&amp; .. 然后打印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

2 个答案:

答案 0 :(得分:2)

URI查询字符串的解码由servletcontainer(Tomcat,JBoss,Glassfish等)管理。这通常是ISO-8859-1的默认值。您需要将servletcontainer中的查询字符串解码字符集配置为与JSF / Facelets用于对响应和POST请求进行编码的字符串相同,默认情况下为UTF-8。在您的情况下,查询字符串编码显然使用默认的ISO-8859-1。 é字符存在于UTF-8 encoding的两个字节0xC30xA9中,每个字符又代表ISO-8859-1 encoding个字符Ã和{{1}确切地说,你正在看到的角色。这证实ISO-8859-1被错误地用于代替UTF-8。

当您使用JBoss AS时,您需要将以下条目添加到JBoss ©的{​​{1}},<server>/standalone/configuration/standalone.xml之间:

<extensions>

这将指示JBoss使用<management>解码查询字符串,而不是ISO-8859-1的默认编码。如果仍然不起作用(当您使用PrimeFaces时可能会发生这种情况),那么除了上面的配置条目之外,还需要使用servlet过滤器将字符编码显式设置为UTF-8。这部分在Unicode input retrieved via PrimeFaces input components become corrupted的解决方案1中得到解答。

另一个可能的原因是<system-properties> <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true" /> </system-properties> 结束的输出目的地没有使用UTF-8来显示打印的字符。这反过来与JSF和servletcontainer完全无关。你也没有说出ServletRequest#getCharacterEncoding()正在运行的上下文,所以很难在这里给出一个合适的答案。但如果它是例如Eclipse,那么你可以通过设置 Window&gt;来配置它。偏好&gt;一般&gt;工作区&gt;文本文件编码为UTF-8。

另见:

答案 1 :(得分:0)

在集成到上一个答案时,您可以尝试添加:

<system-properties>
    <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
    <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true" />
</system-properties>

到standalone.xml配置文件。