【问题标题】:Remove "empty" character from String从字符串中删除“空”字符
【发布时间】:2011-03-24 17:11:25
【问题描述】:

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

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

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

我尝试像这样构建一个新字符串:

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 .. 有问题,但我无法更改我正在使用的框架或等待他们修复它(如果这是他们框架中的错误)。我需要处理这个字符串并清理它。

有什么想法吗?

【问题讨论】:

  • 那是什么?尝试写出每个字符的 unicode 编号(只需将 char 转换为 int)。
  • 这可能是 U+FEFF 字符吗?那么它可能是存储为 UTF-* 的文件中的字节顺序标记

标签: java character


【解决方案1】:

你可以试试replace:

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

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

科特林:

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

【讨论】:

    【解决方案2】:

    只需 ma​​lformedString.trim() 即可解决问题。

    【讨论】:

    • 不,它没有:"\uFEFFTYPE".trim().equals("\uFEFFTYPE")
    【解决方案3】:

    这对我有用:-

        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 左右。

    【讨论】:

      【解决方案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 从网络服务器读取数据时,我需要将此添加到我的代码中。网络服务器没有发送空白标记,但它在读取输入流时被拉入。原文可以在here找到。

      【讨论】:

      • 感谢您指出这一点,您为我节省了很多时间:-)
      【解决方案5】:
      for (int i = 0; i < s.length(); i++)
          if (s.charAt(i) == ' ') {
              your code....
          }
      

      【讨论】:

        【解决方案6】:

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

        要确定确切的代码点,请这样做:

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

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


        更新:根据更新:

        任何人都知道一种只包含有效字符范围而不是排除 UTF8 范围的 95% 的方法吗?

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

        另一方面,您也可以只从根本上解决问题,而不是解决问题。要么更新文件以消除 BOM 标记,这是一种将 UTF-8 文件与其他现在毫无价值的文件区分开来的传统方法,要么使用识别并跳过 BOM 的Reader。另见this question

        【讨论】:

          【解决方案7】:

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

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

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

          [...] 构造称为字符类,例如[aeiou] 匹配任何一个小写元音,[^aeiou] 匹配除此之外的任何一个。

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

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

          参考文献

          【讨论】:

            【解决方案8】:

            谢谢约翰内斯·罗塞尔。它实际上是'\uFEFF'

            以下代码有效:

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

            任何人都知道一种只包含有效字符范围而不是排除 UTF8 范围的 95% 的方法吗?

            【讨论】:

            • 你应该更精确地定义“有效字符”。
            • 这个效率低下,只要检查第一个字符是否为FEFF并使用子字符串,String.trim()会做剩下的。
            【解决方案9】:

            向左或向右修剪会删除空格。空格前有冒号吗?

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

            【讨论】:

              【解决方案10】:

              你可以像这样检查空格:

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

              【讨论】:

              • 问题已经确定字符不是空格。
              • 问题确实说它不是空格;但是,在给出的三个代码示例中,他使用比较运算符来检查字符,如果我没记错的话,您不能使用比较运算符来检查某个字符,因为它们正在检查您是否引用内存中的同一位置而不是字符代码。根据提供的代码,这只是一个有用的建议/选项。
              • 我知道你来自哪里 - 对于 Character 对象,使用 equals() 是正确的做法。在处理哪些字符时,我倾向于保留字符,对于字符,您可以使用 ==,因为它是原始类型。
              猜你喜欢
              • 2019-06-14
              • 1970-01-01
              • 2011-09-21
              • 1970-01-01
              • 2011-04-20
              • 1970-01-01
              • 1970-01-01
              • 2014-07-04
              • 1970-01-01
              相关资源
              最近更新 更多