【问题标题】:Can't read accented character from query string无法从查询字符串中读取重音字符
【发布时间】:2013-07-14 10:05:15
【问题描述】:

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

.xhtml代码sn-p如下:

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

如果查询字符串包含...&requestString=abcdefgh&..... 然后它会正确打印abcdefgh。 但如果查询字符串包含 ...&requestString=SociétéGéniale&.. 然后它打印SociétéGéniale。 但我想要SociétéGéniale。 任何指针都会对我很有帮助。

Edit-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

【问题讨论】:

  • 调试和检查requestString时,值是否仍然是乱码?我怀疑控制台字符集可能在这里玩坏了。

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


【解决方案1】:

URI 查询字符串的解码由 servlet 容器(Tomcat、JBoss、Glassfish 等)管理。这通常默认为 ISO-8859-1。您需要将 servletcontainer 中的查询字符串解码字符集配置为与 JSF/Facelets 用于对响应和 POST 请求进行编码的字符集相同,默认为 UTF-8。在您的情况下,查询字符串编码显然使用默认的 ISO-8859-1。 é 字符存在于UTF-8 encoding 的两个字节0xC30xA9 中,每个字节又分别表示ISO-8859-1 encoding 字符é,正是您所看到的字符。这确认错误地使用了 ISO-8859-1 而不是 UTF-8。

当您使用 JBoss AS 时,您需要将以下条目添加到 JBoss 的 /standalone/configuration/standalone.xml&lt;server&gt;,在 &lt;extensions&gt;&lt;management&gt; 之间:

<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的方案一中得到解答。

另一个可能的原因是 System.out.println() 最终所在的输出目标没有使用 UTF-8 来呈现打印的字符。这又与 JSF 和 servletcontainer 完全无关。您也没有告诉任何有关 System.out.println() 运行的上下文的信息,因此在这里也很难给出合适的答案。但如果是 Eclipse,那么您可以通过将 Window > Preferences > General > Workspace > Text File Encoding 设置为 UTF-8 来配置它。

另见:

【讨论】:

  • 感谢@BalusC 的回复:我尝试将给定的&lt;system-properties&gt; 配置添加到JBoss 的standalone.xml 文件中。但是在服务器启动过程中产生了错误。
  • 如果您详细说明错误而不是将其过度概括为“错误”,这将很有帮助。错误本身即包含对概念问题的答案。未能解释错误并不意味着应该忽略该错误。
  • 你需要把&lt;system-properties&gt;放在&lt;extensions&gt;&lt;management&gt;之间。
  • 问题仍然存在。输出20:04:46,685 INFO [stdout] (http-localhost-127.0.0.1-8080-1) ::::::::::::::::::::::::::Avinaba-Bandhu-MAJUMDER-has-requested-to-create-customer-Société-Génial-In-ADB.-
  • 然后直接进入答案中的下一段。
【解决方案2】:

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

<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 配置文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多