如何对Java字符串中的卷曲引号进行HTML转义
我有一个字符串,里面有卷曲的引号。我想用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
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("“");
break;
case '”':
sb.append("”");
break;
case '‘':
sb.append("‘");
break;
case '’':
sb.append("’");
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}
显然,Linux机器上构建链的某些部分无法识别和区分这些奇特的字符
我的下一次尝试是使用Unicode转义。不幸的是,这甚至不能在我的Mac上编译:
...
case '\u8220':
sb.append("“");
break;
case '/u8221':
sb.append("”");
break;
...
我的编译器提出了这样的抱怨:
Out.java:[346,21] unclosed character literal
我很困惑,人们如何做这一点的替代,并让它跨平台可靠地工作。有人有什么建议吗?提前感谢。编译器的问题是因为您使用了“/u8221”而不是“\u8221”-正斜杠而不是反斜杠 我不完全相信使用实体会有帮助,但是你可以试试。。。我想这取决于下游代码的破坏程度
编辑:Doh,我没有发现您的Unicode值是十进制的。是的,它们必须是十六进制:)我将在这里留下这个答案,因为它解释了编译器为什么抱怨-“\u8221”是一个完美的字符转义序列,而不是您想要的:)Unicode文本是十六进制的:
case '\u201c':
sb.append("“");
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("“");
break;
....