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

时间:2008-09-16 14:10:07

标签: algorithm string unicode

想象一下,我在C#中有字符串:“我不喜欢,但是,看到你......”

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

我该怎么做?

12 个答案:

答案 0 :(得分:18)

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

•是序列C3 A2,E2 82 AC,E2 84 A2。

  • UTF-8 C3 A2 = U + 00E2 =â€/ li>
  • 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的两个位置。

答案 1 :(得分:3)

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

那个垃圾是如何首先进入那里的?这是真正的问题。

答案 2 :(得分:3)

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

不要忘记名字中有“â”的可怜人。

答案 3 :(得分:2)

对于使用标准字符编码存储在数据库中的Windows字符集处理的字符编码问题,这看起来令人不安。我看到有人投票支持Will,但他有一点意见。您可能正在解决这个问题,但如果这是问题,则字符组合是无限的。

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

char.IsLetterOrDigit;

请有各种各样的其他如...

char.IsSymbol;
char.IsControl;

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

使用您不想要的黑名单,或者最好使用白名单(套装)。使用白名单,您可以遍历字符串,只将白名单中的字母复制到结果字符串中。你说删除了,你这样做的方法就是你从(R)读到的两个指针和你写的一个指针(W):

I Donââ‚
     W  R

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

使用C通过使用预定义函数(或宏)之一轻松获取白名单:isalnum,isalpha,isascii,isblank,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper, isxdigit判断。在这种情况下,您使用白名单功能而不是一套课程发送。

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

/阿伦

答案 10 :(得分:0)

如果String具有任何垃圾日期,这可以很好地删除那些垃圾日期

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

     //OutputString having the following result 

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

答案 11 :(得分:0)

我在EXIF转储中由adobe引发了无关的垃圾问题。我花了一个小时寻找一个直接的答案,并尝试了许多半生不熟的建议,这些建议在这里没有用。

这个帖子比我读过的大多数帖子都充满了深刻的探究性问题,例如“它是如何实现的?”#39;,'如果有人在他们的名字中有这个角色怎么办?&# 39;,'你确定要打破国际化吗?'。

有一些令人印象深刻的博学显示,这些垃圾如何得到这里并解释各种字符编码方案的演变。这个人想要知道如何删除它,而不是它是如何形成的,或者标准组织是什么,这个琐事可能很有趣。

我写了一个小程序给了我正确的答案。而不是解释主要概念,这里是整个,自包含,工作(至少在我的系统上)程序和我用来制造垃圾的输出:

#!/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&lt; 6s-2014.1031-238246.halloween.exf.dif&gt; exf.ascii.dif