【问题标题】:Encoding errors in .jspx.jspx 中的编码错误
【发布时间】:2010-07-23 11:31:25
【问题描述】:

我目前正在尝试在 WebLogic 应用服务器上部署一些 RSS 提要。提要的视图是 .jspx 文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" 
    xmlns:georss="http://www.georss.org/georss"
    xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:util="http://example.com/util">
    <jsp:directive.page pageEncoding="utf-8" contentType="application/xhtml+xml" /> 

    <jsp:useBean id="now" class="java.util.Date" scope="page" />

    [...]

    <c:forEach var="category" items="${categories}">
    <entry>
        <title>${util:htmlEscape(category.label)}</title>
        <id>${category.id}</id>
        <c:if test="${empty parentId}">
        <link href="${util:htmlEscape(fullRequest)}?parentId=${category.id}" />
        </c:if>
        <summary>${util:htmlEscape(category.localizedLabel)}</summary> 
    </entry>
    </c:forEach>
</feed>

问题在于,在我的本地开发服务器 (Apache Tomcat 6.0) 上一切正常,但在 WebLogic 服务器上,所有 UTF-8 字符都被弄乱了。

在 Firefox 中,我看到类似 &lt;summary&gt;Formaci�n&lt;/summary&gt; 的内容。奇怪字符的字节序列是ef bf bd,我似乎在我正在进行的测试中应该收到的所有 UTF-8 字符(á,ó,í)都得到了这个。我已经检查了 firebug 中的内容类型和编码,看起来没问题(Content-Type: application/xhtml+xml; charset=UTF-8)。

在 Chrome 中,第一次出现奇怪字符时内容会被截断,并显示错误消息:This page contains the following errors: error on line 1 at column 523: Encoding error

我不确定发生了什么,但考虑到在我的本地 Tomcat 上一切正常,我认为这与 Web 服务器正在执行的操作有关。欢迎任何想法。

谢谢,
亚历克斯

【问题讨论】:

  • util:htmlEscape() 到底在做什么?没错,它正在转义 HTML,但我想知道您为什么不为此使用 JSTL 提供的 fn:escapeXml()。这可能是编码问题的根本原因。顺便说一句,xml 命名空间中有一个错字.. hputil vs util
  • 我是 Java/jsp(x) 的新手,我没有找到用于转义的库函数,所以我自己写了:)。我会用你建议的替换它,但我很确定我的功能不是问题。我尝试完全不调用它,但 UTF-8 字符仍然被损坏。

标签: java unicode character-encoding weblogic jspx


【解决方案1】:

问题出在 jspx 指令中属性的顺序 以及我没有在 contentType 属性中包含字符集这一事实!

切换后:

<jsp:directive.page pageEncoding="utf-8" contentType="application/xhtml+xml" />

到:

<jsp:directive.page contentType="application/xhtml+xml; charset=UTF-8" 
     pageEncoding="UTF-8" />

人物表现很好。我又摆弄了一下,奇怪的是,发现:

<jsp:directive.page pageEncoding="UTF-8"
      contentType="application/xhtml+xml; charset=UTF-8" />

不起作用。我真的不明白为什么,但我猜这是WebLogic中的一个错误。我部署的版本是 10.0。

【讨论】:

  • 哇,太恶心了。很好的发现!
【解决方案2】:

Unicode Replacement Character U+FFFD(实际上是十六进制 0xEF 0xBF 0xBD)。

此字符在 Firefox 中用于替换其 unicode 代码点实际上位于指示浏览器呈现页面的字符编码范围之外的字符。

由于指示浏览器以 UTF-8 呈现页面,并且该字符最初为 óU+00F30xC3 0xB3),当使用单字节字符集解码时,该字符将被错误格式化为未知字符到 0xF3 而不是 0xC3 0xB3,症状表明服务器实际上将响应解码为 ISO-8859-1 而不是 UTF-8,但仍指示浏览器使用 UTF 对其进行编码-8.

我不做 Weblogic,所以我用 Google 搜索了一下,发现了 this old bug report,其中有人建议将以下内容添加到 weblogic.xml 文件中,以强制它使用 UTF-8 解析 JSP 文件。

<weblogic-web-app>
    <jsp-descriptor>
        <jsp-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </jsp-param>
        <jsp-param>
            <param-name>compilerSupportsEncoding</param-name>
            <param-value>false</param-value>
        </jsp-param>
    </jsp-descriptor>
</weblogic-web-app>

看看这是否有助于解决您的问题。

【讨论】:

  • 感谢您的回复!它帮助我更好地理解发生了什么。我最终发现了这个问题,我已经发布了回复。我尝试了您建议的配置示例,但是当我尝试将其推送到服务器时它给了我一个错误,所以我开始尝试其他东西:)。再次感谢亚历克斯。
猜你喜欢
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多