【问题标题】:How To HTML Escape Curly Quotes in a Java String如何 HTML 转义 Java 字符串中的花括号
【发布时间】:2010-12-16 10:59:45
【问题描述】:

我有一个包含大引号的字符串。我想用 HTML 实体替换它们,以确保它们不会混淆其他下游系统。对于我的第一次尝试,我只是为要替换的字符添加了匹配,直接在我的代码中输入它们:

public static String escapeXml(String s) {
    StringBuilder sb = new StringBuilder();
    char characters[] = s.toCharArray();
    for ( int i = 0; i < characters.length; i++ ) {
        char c = characters[i];
        switch (c) {
            // other escape characters deleted for clarity
            case '“':
                sb.append("&#8220;");
                break;
            case '”':
                sb.append("&#8221;");
                break;
            case '‘':
                sb.append("&#8216;");
                break;
            case '’':
                sb.append("&#8217;");
                break;
            default:
                sb.append(c);
                break;
        }
    }
    return sb.toString();
}

这在我的 Mac 上编译并运行良好,但是当我们的 CI 服务器(在 Linux 上运行)尝试构建它时,它卡住了:

Out.java:[347,16] duplicate case label

显然,Linux 机器上的构建链的某些部分无法识别和区分这些花哨的字符。

我的下一个尝试是使用 Unicode 转义。不幸的是,这甚至无法在我的 Mac 上编译:

...
            case '\u8220':
                sb.append("&#8220;");
                break;
            case '/u8221':
                sb.append("&#8221;");
                break;
...

我的编译器抛出这个抱怨:

Out.java:[346,21] unclosed character literal

我对如何进行这种替换并让它跨平台可靠地工作感到困惑。有人有任何指示吗?提前致谢。

【问题讨论】:

  • 不使用大引号怎么样?
  • ...等等,应该是case '/u8221': 还是case '\u8221':
  • Re: Unicode 转义 - 我看到 2 个 switch case 有不同的斜杠 - \ 和 /
  • @Matt:数据来自我们的 CMS,营销人员在其中放入他们想要的任何疯狂的东西。 :)
  • @Sean McMains - 请参阅此答案以了解如何转义任何 Unicode 代码点:stackoverflow.com/questions/1273986/…

标签: java unicode html-entities


【解决方案1】:

您可以使用文字字符(即'‘'),但您的构建过程需要在编译期间指定正确的源编码。 javac 命令选项是 -encoding。 (Ant 的 javac 任务上的属性是相同的。)这应该与您的 IDE 在保存文件时使用的任何编码相匹配。

例如,如果您的 IDE 使用 UTF-8,但构建机器使用其平台默认编码的 US-ASCII,则特殊字符将被解码为 ?。由于现在多个案例具有相同的标签,因此您会收到原始错误消息。

【讨论】:

  • 很高兴知道这一点。但是,我想我将继续使用转义版本,这样我们在检查代码时就不必为各种机器上的编码问题而斗争。谢谢你的信息!
【解决方案2】:

Unicode 文字是十六进制的:

case '\u201c':
    sb.append("&#8220;");
    break;
....

而且,正如其他答案中所述,您的一个文字中有 / 而不是 \

【讨论】:

  • 这是我的第二期。欣赏它,亚当。
【解决方案3】:

编译器问题是因为您使用的是 '/u8221' 而不是 '\u8221' - 正斜杠而不是反斜杠。

我并不完全相信使用实体会有所帮助,但您可以尝试...我想这取决于下游代码的损坏程度。

编辑:Doh,我没有发现您的 Unicode 值是十进制的。是的,它们需要是十六进制的:) 我将把这个答案留在这里,因为它解释了编译器抱怨的原因 - '\u8221' 是一个完美的字符转义序列,而不是你想要的那个:)

【讨论】:

  • 那又是一个“为什么我的英文文本中间会出现汉字?”的情况。 ;-)
  • 哈!嗯,这绝对是我的第一个问题。为那个踢自己——谢谢,乔恩。
【解决方案4】:

默认编码因平台而异 - Windows 使用其自己的 ISO-Latin-1 方言(至少是我使用过的方言)。 Linux 经常使用 UTF-8(这很可能是您的问题),而 Mac 使用 MacRoman。您可以通过保持纯 7 位 ASCII 来规避大部分问题,如果您在源代码中需要它,可以使用 \u 来处理任何上述问题。

就我个人而言,我会在 Java 源代码之外保留任何“国家”的内容,并使用本地化功能来查找简单键的翻译字符串,它们被放置在您的 Java 代码中。

【讨论】:

    【解决方案5】:

    【讨论】:

    • 我其实很喜欢这个库,但它并没有完全符合我们的需要,所以我们必须做我们的自定义版本。 (我记得旧版本的 IE 给我们的撇号编码方式带来了麻烦。)
    猜你喜欢
    • 2016-01-13
    • 2023-03-30
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2011-07-17
    • 2013-11-21
    • 2019-08-25
    相关资源
    最近更新 更多