JSP将单引号和双引号显示为符号

时间:2009-09-04 13:09:30

标签: java html jsp

我有一个JSP页面检索数据,当单引号或双引号出现在文本中时,它们显示为此符号。

JSP代码:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>General</title>
    </head>
    <body>
        <h1> <%= order.getDescription %> </h1> 
    </body>
</html>

示例:订单的描述应如下所示

“20 - 4”x 6“小部件”

但我得到了这个,

“20 - 4 x 6小部件”

注意:我无法修改数据库。

[编辑]

我使用了commons-lang-2.4.jar来逃避角色,这些是给我带来麻烦的主要角色:

  1. &amp;#145 - &gt; “
  2. &amp;#146 - &gt; “
  3. &amp;#147 - &gt; “
  4. &amp;#148 - &gt; “
  5. &amp;#150 - &gt; -
  6. 我确信某些格式的其他字符会给我带来问题,但是,我只是替换了字符以进行临时修复,我目前正在测试下面的建议。

    [解决方案代码]

    这可能不是最好的方法,但它完成了工作。从数据库中检索数据后,下面的代码位于支持bean中。

    description = StringEscapeUtils.escapeHtml(description);
    
    description = description.replaceAll("&#145;", "&quot;");
    description = description.replaceAll("&#146;", "&quot;");
    description = description.replaceAll("&#147;", "&quot;");
    description = description.replaceAll("&#148;", "&quot;");
    description = description.replaceAll("&#150;", "-");
    
    description = StringEscapeUtils.unescapeHtml(description);
    

4 个答案:

答案 0 :(得分:9)

这是字符U + 0094,这是一个很大程度上未使用的控制代码。如果使用ISO-8859-1来解码实际位于Windows代码页1252(西欧)中的字节,通常会出现此范围内的字符。它们是相似的编码并且经常彼此混淆,但0x80-0x9F范围内的符号是不同的。 Windows cp1252使用其中一些用于智能引号之类的东西,这是你可能期望的:双关闭引用(“,U + 201D右双引号)。

大多数网络浏览器在被告知网页为ISO-8859-1时,实际上会使用cp1252来渲染报价。所以这可能不是标记方面的问题。

您可能拥有的是包含CP1252的数据库,以及使用ISO-8859-1将字节转换为字符串的数据访问层 - 可能是因为这是服务器的默认编码。理想情况下,您希望将数据库配置为本机存储Unicode字符串,但如果您不能这样做,则需要一种方法来配置数据库连接器以使用CP1252编码而不是ISO-8859-1。你如何做到这一点取决于你与之相关的内容;您可能必须设置属性,或在连接字符串中包含参数。

如果你不能用你的数据层做 ,那么剩下的唯一事情就是手动检查从数据库中获得的所有字符串值并将它们转码回它们应该是什么,通过ISO-8859-1编码编码,然后用CP1252解码。这将是一个真正的痛苦,但作为最后的手段将起作用。

[Side-issue:close-double-quote是表示英寸的错误字符。 “(Unicode U + 2033 DOUBLE PRIME)是最好的,但如果你只限于遗留编码,那么直接的”双引号就可以了。“

答案 1 :(得分:1)

这些可能是您数据库中的非标准字符...也许是方向引号而不是直接上下的字符?

处理此问题的直接方法,因为您无法更改数据库中的数据,只需使用替换或正则表达式将“坏”字符换成可正确显示的字符。

答案 2 :(得分:0)

0094是一个卷曲的双引号。编写一个方法,用直接的双引号替换它,或者用卷曲双引号替换HTML实体:&rdquo;&#x94,显示如下:4“x 6”

答案 3 :(得分:0)

0094指出,不是直的双引号。并不是说使用不同的引用有问题,但大多数字体都没有0094 only some east asian fonts seem to have this character。事实上,CANCEL字符属于control character category,而不属于initial quotefinal quote字符类别。

它虽然是it is present in the Latin-1 supplement Unicode块,但它也是一个相对未使用的字符。所以你可以强加一个过滤器(输入或输出)来处理这个角色。

输入过滤器只会强制显示应用程序将存储的字符白名单,并且显然支持显示。

输出过滤器基本上会替换为您提供问题的Unicode字符,并提供更好的变体。