代码之家  ›  专栏  ›  技术社区  ›  Lukas Å alkauskas

如何从字符串中删除这些符号(垃圾)?

  •  1
  • Lukas Å alkauskas  · 技术社区  · 16 年前

    想象一下我有一根绳子在C中:“我没看见你……”

    我想删除(替换为空等)这些“”符号。

    我该怎么做?

    12 回复  |  直到 10 年前
        1
  •  18
  •   Mike Dimmick    16 年前

    这个“垃圾”看起来很像是有人将UTF-8数据解释为ISO 8859-1或Windows-1252,可能是反复出现的。

    序列是c3 a2,e2 82 ac,e2 84 a2。

    • UTF-8 C3 A2=U+00E2=
    • UTF-8 E2 82 AC=U+20AC=
    • UTF-8 E2 84 A2=U+2122=

    然后我们再做一次:在Windows1252中,这个序列是e2 80 99,所以字符应该是u+2019,右单引号()

    您可以使用字节数组、encoding.utf8和encoding.getencoding(1252)进行多次传递,以正确地将垃圾返回到最初输入的内容。您需要检查您的处理过程,找出两个UTF-8数据被错误地解释为Windows-1252的地方。

        2
  •  3
  •   Will    16 年前
    "I Don’t see ya..".Replace( "’", string.Empty);
    

    那垃圾是怎么运进来的?这才是真正的问题。

        3
  •  3
  •   Marc Hughes    16 年前

    通过删除任何非拉丁字符,您将故意破坏一些国际化支持。

    别忘了那个叫“”的可怜人。

        4
  •  2
  •   willasaywhat    16 年前

    对于处理使用标准字符编码存储在数据库中的Windows字符集的字符编码问题,这看起来非常熟悉。我看到有人投了反对票,但他说得有道理。您可能正在解决眼前的问题,但如果是这个问题,字符组合是无限的。

        5
  •  2
  •   Liedman    16 年前

    如果必须这样做,正则表达式可能是最好的解决方案。

    我强烈建议您考虑一下为什么您必须这样做,不过-至少您列出的一些不受欢迎的字符在其他语言中是完全有效和有用的,并且仅仅将它们过滤掉很可能会使您的一些国际用户感到恼火。作为一个瑞典人,我强调不了多少 憎恨 无法正确处理我们的、元和字符的系统。

        6
  •  1
  •   itsmatt    16 年前

    考虑使用regex.replace(您的_字符串,regex,“”)-这是我使用的。

        7
  •  1
  •   Phil Wright    16 年前

    依次测试每个字符,看看它是有效的字母或数字字符,如果不是,则将其从字符串中删除。字符测试非常简单,只需使用…

    char.IsLetterOrDigit;
    

    请还有其他各种各样的,如…

    char.IsSymbol;
    char.IsControl;
    
        8
  •  1
  •   Ed    16 年前

    regex.replace(“字符串”,“[^a-z a-z]”,“);

    虽然正则表达式([^a-z a-z])在大多数语言中都可以使用,但这就是在C语言中实现的方法。

    [编辑:忘记了regex中的空格]

        9
  •  0
  •   Gishu    16 年前

    这些字符的ASCII/整数代码将超出正常的字母范围。查找并替换为空字符。我相信字符串有一个替换方法。

        10
  •  0
  •   Allan Wind    16 年前

    要么使用你不想要的东西的黑名单,要么最好是白名单(一套)。使用白名单,您可以迭代字符串,只将白名单中的字母复制到结果字符串中。你说移除,你这样做的方式是有两个指针,一个是你读的(r),另一个是你写的(w):

    I Donââ‚
         W  R
    

    如果您的白名单中有逗号,那么在本例中,您将阅读逗号并将其写在当前位置,然后前进两个指针。UTF-8是一种多字节编码,因此前进指针可能不仅仅是添加到地址中。

    使用C,通过使用一个预定义的函数(或宏):isalnum、isalpha、isascii、isblank、iscntrl、isdigit、isgraph、islower、isprint、ispunct、isspace、isupper、isxdigit,很容易获得白名单。在这种情况下,您发送的是一个白名单函数,而不是一组当然。

    通常,当我看到像您所拥有的数据时,我会查找内存损坏,或者有证据表明我期望的编码与输入数据时使用的编码不同。

    艾伦

        11
  •  0
  •   nhahtdh Pankaj Wadhwa    11 年前

    如果字符串中有任何垃圾日期,则最好删除这些垃圾日期

    string InputString = "This is grate kingdom¢Ã‚¬â"; 
    string replace = "’";
    string OutputString= Regex.Replace(InputString, replace, "");
    
    //OutputString having the following result 
    

    它对我有好处。

        12
  •  0
  •   BrianP007    10 年前

    我对Adobe在exif垃圾堆里扔进来的外来垃圾也有同样的问题。我花了一个小时寻找一个直截了当的答案,并尝试了许多在这里不起作用的半生不熟的建议。

    这篇文章比我读过的大多数文章都要多,充满了深奥的探索性问题,比如“它是如何到达那里的?”,'如果有人的名字里有这个字符怎么办?','您确定要打破国际化吗?'.

    有一些令人印象深刻的经验表明,这种垃圾是如何在这里得到的,并解释了各种字符编码方案的演变。这个人想知道如何删除它,而不是它是如何产生的,或者组织的标准是什么,这可能是一个有趣的琐事。

    我写了一个很小的程序,给了我正确的答案。这里不是解释主要概念,而是完整的、独立的、正在工作的(至少在我的系统上)程序和我用来核废料的输出:

    #!/usr/local/bin/perl -w
    
    # This runs in a dos window and shows the char, integer and hex values
    # for the weird chars. Install the HEX values in the REGEXP below until
    # the final test line looks normal. 
    $str = 's: “Brian';  # Nuke the 3 werid chars in front of Brian.
    @str = split(//, $str);
    printf("len str '$str' = %d, scalar \@str = %d\n", 
        length $str, scalar @str);
    $ii = -1;
    foreach $c (@str)  {
       $ii++;
       printf("$ii) char '$c', ord=%03d, hex='%s'\n", 
           ord($c), unpack("H*", $c));
    }
    # Take the hex characters shown above, plug them into the below regexp
    # until the junk disappears!
    ($s2 = $str) =~ s/[\xE2\x80\x9C]//g;  # << Insert HEX values HERE
    print("S2=>$s2<\n");  # Final test
    
    Result:
    M:\new\6s-2014.1031-nef.halloween>nuke_junk.pl
    len str 's: GÇ£Brian' = 11, scalar @str = 11
    0) char 's', ord=115, hex='73'
    1) char ':', ord=058, hex='3a'
    2) char ' ', ord=032, hex='20'
    3) char 'G', ord=226, hex='e2'
    4) char 'Ç', ord=128, hex='80'
    5) char '£', ord=156, hex='9c'
    6) char 'B', ord=066, hex='42'
    7) char 'r', ord=114, hex='72'
    8) char 'i', ord=105, hex='69'
    9) char 'a', ord=097, hex='61'
    10) char 'n', ord=110, hex='6e'
    S2=>s: Brian<
    

    这是正常的!!!!

    我遇到的另一个可行的工作建议是: iconv-c-t ascii<6s-2014.1031-238246.halloween.exf.dif>exf.ascii.dif