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

问题描述:

想象一下,我在C#中有字符串:“我donâ’看到你..”如何从字符串中删除这些符号(垃圾)?

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

我该怎么做?

+0

卢卡斯:做小李的回答帮助? – Mark 2009-05-03 16:23:57

这个'垃圾'看起来很像某人可能反复将UTF-8数据解释为ISO 8859-1或Windows-1252。

â¢是序列C3 A2,E2 82 AC,E2 84 A2。

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

我们再次做到这一点:在Windows 1252这个序列是E2 80 99,所以性格应该是U + 2019,右单引号(')

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

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

+0

这很容易,但不是我认为的最佳解决方案。 我需要尽可能最佳(最快)的方式。 :)但感谢您的想法。 – 2008-09-16 14:16:28

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

+0

不错的想法:)我忘了关于正则表达式:) – 2008-09-16 14:17:35

"I Don’t see ya..".Replace("’", string.Empty); 

那垃圾怎么会在那里得到第一名?这是真正的问题。

+0

“非常有趣”:) – 2008-09-16 14:18:06

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

char.IsLetterOrDigit; 

请有各种其他如...

char.IsSymbol; 
char.IsControl; 

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

I Donâ₠
    W R 

如果逗号是在白名单中,那么你会在这种情况下阅读逗号和写在哪里,然后提前两个指针。 UTF-8是一个多字节编码,所以你前进的指针可能不只是添加到地址。通过使用预定义函数(或宏)之一,使用C很容易获得白名单:isalnum,isalpha,isascii,isblank,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper ,isxdigit。在这种情况下,你发送一个白名单功能,而不是一套课程。

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

/艾伦

这看起来令人不安的熟悉处理Windows字符一个字符编码集的问题被存储在使用标准字符编码数据库。我看到有人投下威尔,但他有一个观点。你可能正在解决眼前的问题,但是如果这是问题,那么角色的组合是无限的。

通过删除任何非拉丁字符,你会故意打破一些国际化的支持。

不要忘记那个名字有个“â”的穷人。

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

我强烈建议您考虑一下为什么你必须这样做 - 至少有一些您的列表不符合要求的字符在其他语言中是完全有效且有用的,只是将其过滤出来很可能会引起骚扰至少有一些国际用户。作为一个瑞典人,我无法强调足够多的我讨厌系统不能正确处理我们的ä,ä和ö字符。

Regex.Replace(“The string”,“[^ a-zA-Z]”,“”);

虽然正则表达式([^ a-zA-Z])应该可以在大多数语言中工作,但您可以在C#中这样做。

[编辑:忘了正则表达式的空间]

如果具有任何垃圾日期字符串,这是很好的办法删除这些垃圾日期

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

//OutputString having the following result 

它的工作对我好。

我在EXIF转储中遇到了adobe抛出的外部垃圾问题。我花了一个小时寻找一个直接的答案,并尝试了许多没有在这里工作的一半的建议。

这个线程比我读过的大多数书中都充斥着深刻的探索性问题,比如“它是如何到达那里的?”,“如果有人有他们的名字这个字符?”,“你确定你想要打破国际化?”。

有一些令人印象深刻的博客展示了这个垃圾如何在这里得到并解释了各种字符编码方案的演变。这个人想知道如何去除它,而不是它如何成为什么样的标准组织,这些琐事可能是有趣的。

我写了一个小程序给了我正确的答案。相反意译为主的概念,这里是整个的,自包含,工作(至少在我的系统)计划和输出我用核弹攻击的垃圾:

#!/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