有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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. &#145->;‘
  2. &#146->;┱
  3. &#147->;“
  4. &#148->;"
  5. &#150->;–

我相信其他一些格式的字符会给我带来问题,然而,我只是做了一个临时修复字符替换,我目前正在测试下面的建议

[解决方案代码]

这可能不是最好的方法,但它完成了任务。从数据库中检索数据后,下面的代码位于支持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) 个答案

  1. # 1 楼答案

    这些可能是数据库中的非标准字符。。。也许是方向性的报价,而不是直接的上下报价

    由于不能更改数据库中的数据,因此处理这个问题的直接方法就是使用replace或regex将“坏”字符替换为正确显示的字符

  2. # 2 楼答案

    这就是字符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双引号)最好,但如果您仅限于传统编码,直接的“双引号”就可以了。]

  3. # 3 楼答案

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

  4. # 4 楼答案

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

    它也是一个相对未使用的字符,尽管是it is present in the Latin-1 supplementUnicode块。所以你可以使用一个过滤器(输入或输出)来处理这个字符

    输入过滤器只需将应用程序将要存储的字符的白名单加在一起,并且显然支持显示

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