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

5
我可以帮您翻译成中文。这段内容是关于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.‘->‘ 2.’->’ 3.“->“ 4.”->” 5.–->–
我确定在相同格式中的其他字符会给我带来问题,但是我只是替换了字符以进行临时修复,现在正在测试下面的建议。
[解决方案代码]
这可能不是最好的方法,但它完成了工作。以下代码位于数据从数据库检索后的支持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个回答

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解码。这将是一项真正痛苦的工作,但作为最后的手段将起作用。
[旁注:关闭双引号不是表示英寸的正确字符。″(Unicode U+2033 DOUBLE PRIME)最好,但如果你受限于传统编码,则直接使用双引号即可。]

我认为你的诊断略有偏差 - 从结果来看,他的字符串中有正确的Unicode数据,但是该数据被编码为Cp1252,而根据元数据使用UTF-8进行解码。详见我的答案。 - McDowell
那是我的第一反应,但我不认为实际上是这种情况。如果您包含一个无效的序列,例如UTF-8页面中的单个0x94字节,大多数浏览器将给您一个替换字符,例如“?”或“�”,而不是问题中发布的实际控制字符‘’。当然,对于这样的问题,总是有点棘手,因为这些类型的字符在被粘贴到此处之前很容易再次损坏... - bobince
你的回答确实解决了一个非常普遍的情况,这可能对于那些需要帮助的人很有用。是未撤销的还是倒置的? - bobince
很棒的写作,非常有帮助。无法让CP1252正常工作。 - Berek Bryan
嗯...尝试使用“Windows_1252”,我认为这可能是Java下的名称。 - bobince

1

你的数据库中可能含有非标准字符...也许是方向引号而不是直上直下的引号?

由于无法更改数据库中的数据,处理这个问题的一种简单方法就是使用替换或正则表达式来交换“坏”字符和能够正确显示的字符。


这不是确切的答案,但它引导了我找到解决方案。 - Berek Bryan

0

0094是弯引号。编写一个方法将其替换为直引号或HTML实体字符弯双引号:&rdquo;&#x94,显示为:4” x 6”。


0

正如所指出的那样,0094不是直接的双引号。虽然使用不同的引号没有问题,但大多数字体中都没有0094 - 只有一些东亚字体似乎有这个字符。实际上,它是CANCEL字符,属于控制字符类别,而不是初始引号结束引号字符类别。

它也是一个相对不常用的字符,尽管它存在于Latin-1补充Unicode块中。因此,您可以强制执行过滤器(输入或输出)来处理此字符。

输入过滤器将简单地强制执行应用程序将存储和显然支持显示的字符白名单。

输出过滤器基本上会用更好的变体替换掉给你带来问题的Unicode字符。


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