【问题标题】:How to remove these kind of symbols (junk) from string?如何从字符串中删除这些符号(垃圾)?
【发布时间】:2010-09-09 12:24:21
【问题描述】:

想象一下我在 C# 中有字符串:“我没有看到你..”

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

我该怎么做?

【问题讨论】:

  • 卢卡斯:迈克的回答有帮助吗?

标签: algorithm string unicode


【解决方案1】:

如果 String 有任何垃圾日期,这是删除那些垃圾日期的好方法

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

     //OutputString having the following result 

对我来说效果很好,感谢您查看此评论。

【讨论】:

    【解决方案2】:

    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 exf.ascii.dif

    【讨论】:

      【解决方案3】:

      Regex.Replace("字符串", "[^a-zA-Z ]","");

      这就是您在 C# 中的做法,尽管该正则表达式 ([^a-zA-Z ]) 应该适用于大多数语言。

      [已编辑:忘记正则表达式中的空格]

      【讨论】:

        【解决方案4】:

        那个“垃圾”看起来很像有人将 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 = ™

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

        您可以使用字节数组、Encoding.UTF8 和 Encoding.GetEncoding(1252) 进行多次传递,以正确地将垃圾变回原来输入的内容。您将需要检查您的处理以找到 UTF-8 数据被错误解释为 Windows-1252 的两个地方。

        【讨论】:

          【解决方案5】:

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

          不过,我强烈建议您考虑一下为什么必须这样做 - 至少您列出的某些不受欢迎的字符在其他语言中是完全有效和有用的,并且仅将它们过滤掉很可能至少会惹恼您的一些国际用户。作为一个瑞典人,我对无法正确处理 å、ä 和 ö 字符的系统的讨厌 的程度再怎么强调也不为过。

          【讨论】:

            【解决方案6】:

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

            别忘了那个名字里有一个“a”的可怜人。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                要么使用您不想要的东西的黑名单,要么最好使用白名单(设置)。使用白名单,您可以遍历字符串并仅将白名单中的字母复制到结果字符串中。你说删除,你这样做的方式是有两个指针,一个从 (R) 读取,一个从 (W) 写入:

                I Donââ‚
                     W  R
                

                如果逗号在您的白名单中,那么在这种情况下,您将读取逗号并将其写入 Ã 所在的位置,然后推进两个指针。 UTF-8 是一种多字节编码,因此您推进指针可能不仅仅是添加到地址。

                使用 C 语言是一种通过使用预定义函数(或宏)之一来获取白名单的简单方法:isalnum、isalpha、isascii、isblank、iscntrl、isdigit、isgraph、islower、isprint、ispunct、isspace、isupper、是x数字。在这种情况下,您发送的是一个白名单功能而不是一组课程。

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

                /艾伦

                【讨论】:

                  【解决方案9】:

                  依次测试每个字符,看它是否是有效的字母或数字字符,如果不是,则将其从字符串中删除。性格测试很简单,用...

                  char.IsLetterOrDigit;
                  

                  请还有其他各种各样的,例如...

                  char.IsSymbol;
                  char.IsControl;
                  

                  【讨论】:

                    【解决方案10】:
                    "I Don’t see ya..".Replace( "’", string.Empty);
                    

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

                    【讨论】:

                    • @HalFas,看起来像是编码问题。
                    • 不幸的是,这可能是由于封闭源系统中的错误(例如,Sparxsystems Enterprise Architect 的 XML 导出中的一个(并且只有一个!)属性在公司的上海分公司经常被错误编码,从而阻止他们在法国或英国导入 UML 模型的更改)
                    【解决方案11】:

                    考虑 Regex.Replace(your_string, regex, "") - 这就是我使用的。

                    【讨论】:

                    • 好主意 :) 我完全忘记了正则表达式 :)
                    【解决方案12】:

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

                    【讨论】:

                    • 这很简单,但不是我认为的最佳解决方案。我需要尽可能优化(最快)的方式。 :) 但谢谢你的想法。
                    最近更新 更多