从String中删除"空"字符

bla*_*666 12 java character

我正在使用一个框架,它会不时地返回带有"空"字符的格式错误的字符串.

例如,"foobar"表示为:[,f,o,o,b,a,r]

第一个字符不是空格(''),因此System.out.printlin()将返回"foobar"而不是"foobar".然而,String的长度是7而不是6.显然这使得大多数String方法(equals,split,substring,..)无用.有没有办法从字符串中删除空字符?

我试着像这样构建一个新的String:

StringBuilder sb = new StringBuilder();
for (final char character : malformedString.toCharArray()) {
  if (Character.isDefined(character)) {
    sb.append(character);
  }
}
sb.toString();
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.与以下代码相同:

StringBuilder sb = new StringBuilder();
for (final Character character : malformedString.toCharArray()) {
  if (character != null) {
    sb.append(character);
  }
}
sb.toString();
Run Code Online (Sandbox Code Playgroud)

我也无法检查这样的空字符:

   if (character == ''){
     //
   }
Run Code Online (Sandbox Code Playgroud)

显然字符串有问题..但我无法更改我正在使用的框架或等待它们修复它(如果它是框架中的错误).我需要处理这个String并对其进行sanatize.

有任何想法吗?

Bal*_*usC 16

它可能是由NULL表示的NULL字符\0.你可以摆脱它String#trim().

要确定准确的代码点,请执行以下操作:

for (char c : string.toCharArray()) {
    System.out.printf("U+%04x ", (int) c);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在这里找到确切的字符.


更新:根据更新:

任何人都知道如何只包括一系列有效字符而不是排除95%的UTF8范围?

你可以在正则表达式的帮助下做到这一点.请参阅@polygenelubricants的答案和答案.

另一方面,您也可以在其根目录中修复问题,而不是解决问题.要么更新文件以摆脱BOM标记,这是将UTF-8文件与现在无价值的其他文件区分开来的传统方式,或使用Reader识别和跳过BOM的文件.另见这个问题.


pol*_*nts 14

在这种情况下,正则表达式是从不需要的Unicode字符清除字符串的适当方法.

String sanitized = dirty.replaceAll("[\uFEFF-\uFFFF]", ""); 
Run Code Online (Sandbox Code Playgroud)

这将替换所有char\uFEFF-\uFFFF用空字符串范围.

[...]构造被称为一个字符类,例如[aeiou]匹配任何一个小写元音,[^aeiou]匹配任何东西.

您可以执行以下两种方法之一:

  • replaceAll("[blacklist]", "")
  • replaceAll("[^whitelist]", "")

参考


Rig*_*key 5

从字符串中删除 UTF-8 BOM 的一种非常简单的方法,使用 Denis Tulskiy 建议的子字符串。不需要循环。只需检查标记的第一个字符,并在需要时跳过它。

public static String removeUTF8BOM(String s) {
    if (s.startsWith("\uFEFF")) {
        s = s.substring(1);
    }
    return s;
}
Run Code Online (Sandbox Code Playgroud)

在使用 Apache HTTPClient EntityUtil 从网络服务器读取时,我需要将此添加到我的代码中。网络服务器没有发送空白标记,而是在读取输入流时被拉入。原始文章可以在这里找到。