java - 从字符串中删除非 ASCII 不可打印字符

标签 java non-ascii-characters

我得到的用户输入包括非 ASCII 字符和不可打印的字符,例如

\xc2d
\xa0
\xe7
\xc3\ufffdd
\xc3\ufffdd
\xc2\xa0
\xc3\xa7
\xa0\xa0

例如:

email : abc@gmail.com\xa0\xa0
street : 123 Main St.\xc2\xa0

期望的输出:

  email : abc@gmail.com
  street : 123 Main St.

使用 Java 删除它们的最佳方法是什么?
我尝试了以下方法,但似乎不起作用

public static void main(String args[]) throws UnsupportedEncodingException {
        String s = "abc@gmail\\xe9.com";
        String email = "abc@gmail.com\\xa0\\xa0";

        System.out.println(s.replaceAll("\\P{Print}", ""));
        System.out.println(email.replaceAll("\\P{Print}", ""));
    }

输出

abc@gmail\xe9.com
abc@gmail.com\xa0\xa0

最佳答案

您的要求不明确。 Java String 中的所有字符都是 Unicode 字符,因此如果删除它们,您将得到一个空字符串。我假设您的意思是要删除任何非 ASCII、不可打印的字符。

String clean = str.replaceAll("\\P{Print}", "");

在这里,\p{Print} represents a POSIX character class用于可打印的 ASCII 字符,而 \P{Print} 是该类的补充。使用此表达式,所有不可 可打印的 ASCII 字符都将替换为空字符串。 (额外的反斜杠是因为 \ 在字符串文字中开始转义序列。)


显然,所有输入字符实际上都是 ASCII 字符,表示不可打印或非 ASCII 字符的可打印编码。 Mongo 应该不会对这些字符串有任何问题,因为它们只包含普通的可打印 ASCII 字符。

这对我来说听起来有点可疑。我认为正在发生的事情是数据确实包含不可打印和非 ASCII 字符,而另一个组件(如日志记录框架)正在用可打印的表示形式替换这些字符。在您的简单测试中,您未能将可打印表示转换回原始字符串,因此您错误地认为第一个正则表达式不起作用。

那是我的猜测,但如果我误解了情况,而你确实需要去除文字 \xHH 转义,你可以使用以下正则表达式来完成。

String clean = str.replaceAll("\\\\x\\p{XDigit}{2}", "");

Pattern 的 API 文档类很好地列出了 Java 的正则表达式库支持的所有语法。有关所有语法含义的更多详细信息,我找到了 Regular-Expressions.info site很有帮助。

关于java - 从字符串中删除非 ASCII 不可打印字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11020893/

相关文章:

java - 无法在项目上执行目标 org.apache.maven.plugins :maven-compiler-plugin:3. 5.1:编译(默认编译)

java - 如何使用 Jersey 客户端 API 在 RESTful 调用中添加 header

php - 使用非拉丁字符搜索 Geoname 数据库

css - 使用 :before pseudo element 插入非 ASCII 字符

json - 使用 list.files 在 R 中读取带重音的文件名

special-characters - BundleDisplayName 中的西类牙口音

java - 获取 WiFi 状态并使用广播接收器对其进行操作

java - Oracle MAF : Is it do anything that IOS xcode and android eclipse does

c - 当在 C 中的字符串中分配时,ASCII 字符 14(和其他)

java - View.gettag 返回 null,我在 ListView/ArrayAdapter 设置中错过了什么?