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

标签 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>

托管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两个字节 0xC30xA9其中每个依次代表 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/

相关文章:

java - Thymeleaf:使用相同的模板和来自不同 Controller 的动态 url

java - 国际化 : Umlaut not being displayed correctly in JSP

string - 如何将使用 Windows 代码页 1251 编码的字符串转换为 Unicode 字符串

java - 无法解析项目 : Android library and Java library module dependency

java - 在不使用断言的情况下对此方法进行 Junit 测试?

java - 带有可编辑数据表的 Primefaces selectManyCheckbox 将空值提交给转换器

validation - OmniFaces validateOrder 禁用

javascript - 如何通过javascript一键计算和验证然后提交和导航

character-encoding - Windows Phone 字符编码

java - Mockito 不模拟模拟对象的字段