Java中的特殊字符

3
我有一个表单(使用struts 1),需要进行验证。在验证期间,我被要求删除MS Word的弯曲单引号和双引号标记。这似乎是一个很简单的请求,但我却苦恼不已。
我的测试文本是’ “ ”
首先,我发现当我在调试器中运行我的代码并查看IntelliJ认为的值时,它显示â\u0080\u0099 â\u0080\u009C â\u0080\u009D,而â\u0080是不可打印字符。
我使用了一段代码来迭代文本字段中的StringBuilder,并测试文本中的每个字符。它将某些字符替换或删除,如下所示:
switch (origCharAsInt) {

    case ((int)'\u00C2'): sbOriginal.deleteCharAt(isb); break; // weird Word A with the caret over it
    case ((int)'\u00C3'): sbOriginal.deleteCharAt(isb); break; // weird Word A with the tilde over it
    case ((int)'\u00E2'): sbOriginal.deleteCharAt(isb); break; // weird Word a with the caret over it

    case ((int)'\u0099'): sbOriginal.setCharAt(isb, '\''); break; // Word single quote
    case ((int)'\u009C'): sbOriginal.setCharAt(isb, '"'); break; // Word left double quote
    case ((int)'\u009D'): sbOriginal.setCharAt(isb, '"'); break; // Word right double quote

    case ((int)'\u2018'):  sbOriginal.setCharAt(isb, '\''); break;  // left single quote
    case ((int)'\u2019'):  sbOriginal.setCharAt(isb, '\''); break;  // right single quote
    case ((int)'\u201A'):  sbOriginal.setCharAt(isb, '\''); break;  // lower quotation mark

    case ((int)'\u201C'):  sbOriginal.setCharAt(isb, '"'); break;  // left double quote
    case ((int)'\u201D'):  sbOriginal.setCharAt(isb, '"'); break;  // right double quote
    case ((int)'\u201E'):  sbOriginal.setCharAt(isb, '"'); break;  // double low quotation mark

    case ((int)'\u2039'):  sbOriginal.setCharAt(isb, '\''); break;  // Single Left-Pointing Quotation Mark
    case ((int)'\u203A'):  sbOriginal.setCharAt(isb, '\''); break;  // Single right-Pointing Quotation Mark

    default: break;

这似乎有效,因为它替换了一些更严重的废弃物,现在表单似乎包含' " "。但是,如果我再次保存,IntelliJ认为该字段包含Â\u0080 Â\u0080\" Â\u0080\"

所以,我添加了一些情况来删除那些Â字符,但是我对\u0080字符的持久化感到困惑。

我尝试添加更多情况来尝试删除它们,但都没有起作用。

case ((int)'\u0080'): sbOriginal.deleteCharAt(isb); break; // another weird Word non-printing char
case ((int)'\u0082'): sbOriginal.deleteCharAt(isb); break; // another weird Word non-printing char
case ((int)'\u0083'): sbOriginal.deleteCharAt(isb); break; // another weird Word non-printing char
case ((int)'\u0000'): sbOriginal.deleteCharAt(isb); break; // why are these weird symbols showing up?

任何帮助/解释都将不胜感激。

1
注意:我在 http://forum.springsource.org/showthread.php?72944-How-to-handle-Smart-Quotes-pasted-into-TextArea-input 上面找到了上述代码块。 - barclay
另外需要注意的是:在数据库中查看,我发现保存的文本是这样的(经过我能想到的所有混淆处理):€' €" €" 显然我正在处理各种编码方案,但是这是什么鬼。 - barclay
到目前为止,我也尝试过 description.replaceAll("\\p{C}", "");description.replaceAll("![:print:]", "");,但都没有成功。 - barclay
2个回答

0

我不知道为什么这个(在上面的开关内部)不起作用(并且欢迎解释):

case ((int)'\u0080'): sbOriginal.deleteCharAt(isb); break;

但是这个会:

description = description.replaceAll("\u0080", "");

0

你需要适当地转义HTML。在这里Unicode不是答案。 这个链接 是你要用的。


1
问题在于我的用户在Word中编辑文本并将其复制粘贴到我的表单中,当它到达我的Java验证时,它显示为Unicode格式。您建议我在哪个流程中转义HTML? - barclay
是的,我也在等待回复! - Chucky
你需要对HTML表单POST提交的内容进行编码。这是HTTP基础知识。 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接