强制JSF转义Unicode中的特殊字符

4

是否有可能强制JSF以Unicode方式转义特殊字符,而不是以命名实体方式转义,例如ä而不是ä

背景:一些旧的移动设备(例如搭载Android 2.3.4的HTC Desire)拒绝显示包含命名实体的页面:

此页面包含以下错误...实体“auml”未定义。

该页面具有HTML5 Doctype,并且根据规范auml是一个有效的预定义字符引用。因此,我认为这是浏览器的错误,但这对我没有帮助。

我尝试的是用它们的Unicode表示替换特殊字符。但是如果我在视图中放置一个ä甚至一个ä,JSF将呈现给我一个ä。 如果我将实体映射放在文档类型中(我知道这不应该在HTML5文档类型中完成),行为会变得非常奇怪:
<!DOCTYPE html [
    <!ENTITY auml "&#228;">
    <!ENTITY mdash "&#8212;">
    ...
]>

这将产生一个正确的HTML5文档类型,而不需要映射。但是&mdash;将被替换为&#8212;,而&auml;则不会被替换。
有人能解释一下这个问题吗?或者是否有可能配置JSF始终呈现unicode转义实体?

1
使用的是哪个JSF实现/版本?在默认修剪中,无法复制Mojarra 2.1.25的问题。然而,我记得古老版本中存在这样的编码不一致。如果您明确设置了<f:view encoding>为非Unicode兼容编码,则也可能会发生这种情况,但那将是一个太明显的原因。 - BalusC
1
Android 2.3.3 对 &auml; 的渲染对我来说很好...你没有将它作为 XML MIME 类型提供吧?尽管 HTML5 试图模糊这个问题,但是 auml 和其他 HTML 实体在 XML 中不是预定义的,应该被 XML 解析器拒绝。 - bobince
你说得对@BalusC。设置<f:view encoding="ISO-8859-15">似乎是一个太明显的原因了。但对我来说显然不是。感谢你的提示,我感到惭愧。所以问题已经得到解答,尽管我的问题还没有解决。 - lefloh
@lefloh:很奇怪,你只是在一个普通的text/html页面上使用&auml;时就能够重现吗?我不敢相信他们会在一个点发布版中破坏如此基本的行为... - bobince
1
啊... contentType 不一定默认为 text/html,所以你应该手动设置它。参见这个问题。如果你问我,这是 JSF 中一个糟糕的设计,转到 XML 模式会很容易打破你的 JavaScript 一半,除了实体问题。 - bobince
显示剩余3条评论
1个回答

1
如果您将<f:view encoding>设置为非Unicode兼容编码,则会发生这种情况。请相应地进行修复:
<f:view encoding="UTF-8">

自从JSF2在Facelets上,这已经是默认值了,顺便说一下,如果确实在使用JSF2和Facelets,您可以安全地省略它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接