代码之家  ›  专栏  ›  技术社区  ›  Berek Bryan

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

  •  5
  • Berek Bryan  · 技术社区  · 16 年前

    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. &
    3. &#147->
    4. &#148->
    5. &#150->

    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 回复  |  直到 16 年前
        1
  •  9
  •   bobince    16 年前

    这是字符U+0094,这是一个基本上未使用的控制码。如果您使用ISO-8859-1解码实际上位于Windows代码页1252(西欧)中的字节,通常会意外地得到此范围内的字符。它们是相似的编码,经常相互混淆,但0x80-0x9F范围内的符号是不同的。Windows cp1252将其中一些用于智能引号等,这可能是您在这里所期望的:双引号(“,U+201D右双引号)。

    这种混淆使得大多数网络浏览器在被告知网页是ISO-8859-1时,实际上会使用cp1252并呈现引文。所以这可能不是标记方面的问题。

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

        2
  •  1
  •   Beska    16 年前

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

    由于您无法更改数据库中的数据,因此处理此问题的一种简单方法是使用替换或正则表达式将“坏”字符替换为正确显示的字符。

        3
  •  0
  •   Ned Batchelder    16 年前

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

        4
  •  0
  •   Vineet Reynolds    16 年前

    如前所述,0094不是直接的双引号。并不是说使用不同的引号有问题,而是0094在大多数字体中都不可用- only some east asian fonts seem to have this character 事实上,这是CANCEL字符落在 control character category ,而不是 initial quote final quote 字符类别。

    它也是一个相对未使用的字符,尽管 it is present in the Latin-1 supplement Unicode块。因此,您可以设置一个过滤器(输入或输出)来处理此字符。

    输入过滤器只会强加一个白名单,您的应用程序将存储这些白名单中的字符,并且显然在显示中支持这些字符。

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