在Java中从字符串中删除非ASCII字符

22

2
可能出现的字符集与URI查询部分允许的字符集相比较大。删除所有非英文文本将排除许多语言。这是你想要的吗?还是你想对文本进行百分号编码?或者你想将文本转换为英文拼写? - McDowell
5个回答

41

我猜测URL的源头更可能有问题。也许你修复了错误的问题?从URI中删除“奇怪”的字符可能会赋予它完全不同的意义。

话虽如此,你可以尝试使用简单的字符串替换来删除所有非ASCII字符:

String fixed = original.replaceAll("[^\\x20-\\x7e]", "");

如果这不能覆盖“�”字符,您也可以将其扩展到所有非四字节UTF-8字符:

String fixed = original.replaceAll("[^\\u0000-\\uFFFF]", "");

“\u0000 - \uFFFF” 是4个字节还是2个字节? - JSixface
@JSixface:在Java中,Unicode字符是16位或2个字节。但是,在此正则表达式字符串指定的范围上下文中,那个问题对我来说没有意义。 - Cᴏʀʏ
[^\x00-\x7F] 是 ASCII 字符的正确范围,如果您将 x20 作为起始范围,则还会删除换行符。 - Massimo Fazzolari

21
yourstring=yourstring.replaceAll("[^\\p{ASCII}]", "");

7

不不不,这不是ASCII码...[^\x20-\x7E]

这才是真正的ASCII码:[^\x00-\x7F]

否则它将修剪掉换行符和其他特殊字符,这些字符是ASCII表的一部分!


谢谢!我在想我的换行符去哪儿了!! - Louie Bafford

6
为了将字符串中的非ASCII字符去除,以下代码适用于我。
String str="<UPC>616043287409ÂÂÂÂ</UPC>";

str = str.replaceAll("[^\\p{ASCII}]", "");

输出:

<UPC>616043287409</UPC>

1
请尽量避免只是把代码作为答案,而是尝试解释它的作用和原因。对于没有相关编程经验的人来说,您的代码可能不太明显。 - Frits

4

Use Guava CharMatcher

String onlyAscii = CharMatcher.ascii().retainFrom(original)

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