从字符串中删除“空”字符

2022-09-03 09:27:30

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

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

第一个字符不是空格(' '),因此System.out.printlin()将返回“foobar”而不是“foobar”。然而,字符串的长度是 7 而不是 6。显然,这使得大多数 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 == ''){
     //
   }

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

有什么想法吗?


答案 1

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

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

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

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

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

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

引用


答案 2

它可能是 NULL 字符,由 表示。你可以通过 String#trim() 摆脱它。\0

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

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

然后你可以在这里找到确切的角色。


更新:根据更新:

有谁知道一种方法来只包含一系列有效字符,而不是排除95%的UTF8范围?

您可以在正则表达式的帮助下做到这一点。在这里查看@polygenelubricants的答案和这个答案

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