代码之家  ›  专栏  ›  技术社区  ›  black666

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

  •  12
  • black666  · 技术社区  · 14 年前

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

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

    很明显这根绳子有问题。。但是我不能改变我正在使用的框架,也不能等待他们修复它(如果它是他们框架中的一个bug)。我要处理好这根绳子,把它清理干净。

    有什么想法吗?

    9 回复  |  直到 14 年前
        1
  •  16
  •   Community TTT    7 年前

    可能是因为 NULL character \0 String#trim() .

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

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

    然后你就能找到确切的人物 here .


    根据更新:

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

    你可以在regex的帮助下做到这一点。请在此处和此处查看@polygene的答案 this answer .

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

        2
  •  18
  •   polygenelubricants    14 年前

    在这种情况下,Regex是清除字符串中不需要的Unicode字符的合适方法。

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

    char \uFEFF-\uFFFF 包含空字符串的范围。

    [...] 构造称为 字符类 ,例如。 [aeiou] [^aeiou]

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

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

    工具书类

        3
  •  4
  •   RightHandedMonkey    11 年前

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

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

    在使用apachehttpclient EntityUtil从web服务器读取数据时,我需要将其添加到代码中。WebServer没有发送空白标记,但它在读取输入流时被拉入。可以找到原文 here .

        4
  •  2
  •   black666    14 年前

    谢谢你,约翰内斯尔。实际上是'\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范围的方法吗?

        5
  •  1
  •   ESP    14 年前

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

        6
  •  0
  •   Steve Smith    7 年前

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

    我的空字符的int值在8103左右。

        7
  •  -1
  •   acdcjunior Mukul Kumar    11 年前
    for (int i = 0; i < s.length(); i++)
        if (s.charAt(i) == ' ') {
            your code....
        }
    
        8
  •  -1
  •   Lalji Gajera    7 年前

    简单 字符串格式不正确。trim() 会解决问题的。

        9
  •  -3
  •   daiglebagel daiglebagel    14 年前

    您可以像这样检查空格:

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