Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对Java字符串中的卷曲引号进行HTML转义_Java_Unicode_Html Entities - Fatal编程技术网

如何对Java字符串中的卷曲引号进行HTML转义

如何对Java字符串中的卷曲引号进行HTML转义,java,unicode,html-entities,Java,Unicode,Html Entities,我有一个字符串,里面有卷曲的引号。我想用HTML实体替换它们,以确保它们不会混淆其他下游系统。在我的第一次尝试中,我只是添加了要替换的字符的匹配,直接在代码中输入它们: public static String escapeXml(String s) { StringBuilder sb = new StringBuilder(); char characters[] = s.toCharArray(); for ( int i = 0; i < character

我有一个字符串,里面有卷曲的引号。我想用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();
}
显然,Linux机器上构建链的某些部分无法识别和区分这些奇特的字符

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

...
            case '\u8220':
                sb.append("&#8220;");
                break;
            case '/u8221':
                sb.append("&#8221;");
                break;
...
我的编译器提出了这样的抱怨:

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

我很困惑,人们如何做这一点的替代,并让它跨平台可靠地工作。有人有什么建议吗?提前感谢。

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

我不完全相信使用实体会有帮助,但是你可以试试。。。我想这取决于下游代码的破坏程度


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

Unicode文本是十六进制的:

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

而且,正如其他答案中提到的,您的一个文本中有一个
/
而不是
\

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


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

默认编码因平台而异-Windows使用自己的ISO-Latin-1方言(至少是我使用过的那些)。Linux经常使用UTF-8(这很可能是您的问题),Mac使用MacRoman。您可以通过保持纯7位ASCII,并在源代码中使用\u来解决大多数问题


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

更好的方法是使用Apache Commons Lang

不使用卷曲引号怎么样?…等等,这应该是
案例'/u8221':
还是
案例'\u8221':
?Re:Unicode转义-我看到这两个开关案例有不同的斜杠-\和/@Matt:数据来自我们的CMS,营销人员在CMS中放入他们想要的任何疯狂的东西。:)@Sean McMains -看到如何逃避任何Unicode代码点的答案:这将是另一个“为什么汉字出现在我的英语文本中间?”的另一个例子;哈!那肯定是我的第一个问题。谢谢你,乔恩。这是我的第二期。谢谢你,亚当。很高兴知道这件事。不过,我想我会继续使用转义版本,这样我们在签出代码时就不必在不同的机器上处理编码问题。谢谢你的信息!实际上我非常喜欢这个库,但它并没有完全满足我们的需要,所以我们不得不做我们的自定义版本。(我记得,IE的旧版本给我们带来了撇号编码的麻烦。)
case '\u201c':
    sb.append("&#8220;");
    break;
....