从String中删除“空”字符

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

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

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

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

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

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

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

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

  if (character == ''){ // } 

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

有任何想法吗?

它可能是由\0表示的NULL字符 。 您可以通过String#trim()去除它。

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

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

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


更新:根据更新:

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

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

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

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

 String sanitized = dirty.replaceAll("[\uFEFF-\uFFFF]", ""); 

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

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

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

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

参考

  • regular-expressions.info

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

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

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

谢谢JohannesRössel。 它实际上是’\ uFEFF’

以下代码有效:

  final StringBuilder sb = new StringBuilder(); for (final char character : body.toCharArray()) { if (character != '\uFEFF') { sb.append(character); } } final String sanitzedString = sb.toString(); 

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

向左或向右修剪去除空白区域。 太空之前有结肠吗?

甚至更多:a =(长)字符串[0]; 将显示char代码,你可以使用replace()或substring。

这对我有用: –

  StringBuilder sb = new StringBuilder(); for (char character : myString.toCharArray()) { int i = (int) character; if (i > 0 && i <= 256) { sb.append(character); } } return sb.toString(); 

我的NULL字符的int值在8103或者其他地方。

只需malformedString.trim()就可以解决问题。

 for (int i = 0; i < s.length(); i++) if (s.charAt(i) == ' ') { your code.... } 

你可以检查这样的空白:

 if (character.equals(' ')){ // }