从String中删除“空”字符

时间:2010-08-03 12:41:29

标签: java character

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

例如,“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并对其进行整理。

有什么想法吗?

10 个答案:

答案 0 :(得分:16)

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

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

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

然后你就可以找到确切的字符here


根据更新

更新

  

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

你可以在正则表达式的帮助下做到这一点。请在此处查看@polygenelubricants的答案和this answer

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

答案 1 :(得分:13)

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

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

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

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

您可以采取以下两种方法之一:

  • replaceAll("[ <子> blacklist ]", "")
  • replaceAll("[^ <子> whitelist ]", "")

参考

答案 2 :(得分:4)

使用子字符串作为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服务器读取时,我需要将其添加到我的代码中。网络服务器没有发送空白标记,但是在读取输入流时它被拉入。可以找到原始文章here

答案 3 :(得分:2)

谢谢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范围?

答案 4 :(得分:1)

向左或向右修剪去除空白区域。它是否在空间之前有一个冒号?

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

答案 5 :(得分:0)

这对我有用: -

    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或其他地方。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

你可以试试replace

s.replace("\u200B", "")

s.replace("\uFEFF", "")

科特林:

s.filter { it == '\u200B' }

答案 8 :(得分:-1)

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

答案 9 :(得分:-3)

你可以检查这样的空白:

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