在Java中替换字符串中的特殊字符

5

我该如何在Java中替换字符串?

例如:

String a = "adf�sdf";

如何替换和避免特殊字符?


3
欢迎来到 Stack Overflow,zahir!您要从哪里获取这些字符串?是从随机用户那里获取的吗?还是通过 Web 服务获取的?您是试图用该字符串替换某些内容,还是将该字符串用于替换其他内容? - Pops
看起来像是Mojibake——“...由于使用了错误的字符编码而导致的乱码文本。” - Peter Mortensen
4个回答

14

你可以使用String#replaceAll()方法,将模式[^\\x20-\\x7e]替换为空字符来消除所有在可打印 ASCII 范围之外的字符

a = a.replaceAll("[^\\x20-\\x7e]", "");

但这并没有真正解决你的实际问题,它更像是一个变通方法。根据给定的信息很难确定这个问题的根本原因,但阅读这些文章中的任意一篇都应该会有所帮助:


嗯,似乎有一个Markdown错误(链接2没有正确解析),但我似乎找不到/修复它? - BalusC
1
@BalusC:这种情况经常发生(因为我经常链接到Java6文档),您需要将末尾附近的空格替换为“%20”。 - T.J. Crowder
@T.J. 是的,就是这样,谢谢 :) 另外,Firefox通常在粘贴之前会对它们进行转义,但出于某种奇怪的原因,它没有正确地发生。我重新创建了链接,问题就解决了。 - BalusC
@BalusC:我觉得非常讽刺的是,你指出了一篇Joel的文章……他关于Unicode的第一篇文章充满了错误和误解:我记得他发布它时想“WTF!?”。这是Joel的一个“啊哈我懂了”的难忘时刻,但充满了错误。自从他发布了他关于Unicode的第一篇文章以来,我开始对他说过的每一句话都持怀疑态度。;) - SyntaxT3rr0r
@Wiz:这也是我自己写了另一篇文章的原因之一,以更简单的术语、实际的例子和解决方案来澄清其中的一些问题。但是...乔尔的文章中并没有你所暗示的那么多错误吧? - BalusC
我看到的唯一重要错误是(1)他说UTF-8每个字符使用多达六个字节(这在他写文章时是正确的,但一个月后就被更改了),以及(2)他暗示UTF-16和UCS-2是等效的(这从未是正确的)。 - Alan Moore

2
假设您想要删除所有特殊字符,可以使用字符类\p{Cntrl}。然后您只需使用以下代码:
stringWithSpecialCharcters.replaceAll("\\p{Cntrl}", replacement);

1
如果你认为“特殊字符”指的是ASCII控制字符,那么这个方法是可行的。但我个人经验认为它通常指标点符号,不过在这种情况下就不好说了。 - Alan Moore

2

如果没有更多上下文信息的话,回答这个问题很困难。

一般来说,您可能会遇到编码问题。请参阅有关字符编码的绝对最低限度以了解字符编码的概述。


0

您可以使用Unicode转义序列(例如\u201c [一个左花括号])来“避免”不能直接在源文件编码中使用的字符(默认为平台的默认编码,但您可以使用-encoding参数更改它到javac)。


源文件编码默认为平台默认编码,即通常不是UTF-8。 - Michael Borgwardt
@Michael:谢谢,已修复。我不是在胡说八道,不知道它实际上与哪种语言/环境相关?;-) 或者这是在1996年左右的事情... - T.J. Crowder
我怀疑这一点,因为UTF-8直到1993年才被指定,并且Java曾经建议在分发源代码之前使用native2ascii。不过,我预计UTF-8将成为一些新系统的默认设置。 - Michael Borgwardt
@Michael:1993年早于1996年,我记得Java支持这些奇怪的Unicode东西时很时髦和酷,所以这是*可能的,虽然不太可能。;-)(native2ascii,天哪,那是过去的回忆)无论如何,谢谢,即使在2010年之前的信息也显然是错的! - T.J. Crowder

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