题
想象一下我有串在C#:"我DonÃ的司"¢t看到你.."
我要删除(替换为什么或者等)。 这些"×¢个家"¢"符号。
我该怎么做这个?
解决方案
那个"垃圾"看起来很像有人解释UTF-8数据ISO8859-1或Windows-1252,可能是反反复复。
×¢个家"¢是序列C3A2、E2 82交流、E2 84A2。
- UTF-8C3A2=U+00E2=§
- UTF-8E2 82交流=U+20AC=欧元
- UTF-8E2 84A2=U+2122=™
然后我们再做一次:在Windows1252这一序列是E2 80 99,这样的角色应该已经U+2019年,对单引号(')
你可以做出多次通过与字节的数组、编码。UTF8和编码。GetEncoding(1252)正确地把垃圾回到最初输入。你将需要检查您的处理,以找到两个地方,UTF-8数据被错误地解释为Windows-1252.
其他提示
"I Don’t see ya..".Replace( "’", string.Empty);
怎么,垃圾在那里得到的第一个地方吗?这就是真正的问题。
通过消除任何非拉丁文字你就会被故意打破了一些国际化的支持。
不要忘记这个可怜的家伙是谁的名称中有"a"。
这看起来令人不安的是熟悉一字符编码的问题,处理Windows字符集中储存在一个数据库采用的标准字符编码。我看到有人投票将会下降,但他有一个点。你可以解决的紧迫问题,但该组合的人物是无限的,如果是这一问题。
如果你真的要这样做,定期表达可能是最好的解决办法。
我强烈建议你认为为什么你必须要做到这一点,虽然--至少在一些字清单作为不是完全有效和有用的其他语言,只是筛选他们将最有可能惹恼了至少某些国际用户。作为瑞典人,我不能不强调不够,我是多么 恨 系统不能处理我们的埃、ä和的...字正确。
考虑Regex.替换(your_string,regex,"")-这是什么我的使用。
测试每个字中看到,如果它是一个有效的字母或数字如果不删除。字测试是非常简单,只是使用...
char.IsLetterOrDigit;
请有各种其他诸如...
char.IsSymbol;
char.IsControl;
Regex.替换("string","[^a-zA-Z]","");
这就是你会怎么做C#虽然经常表达([^a-zA-Z])在大多数语文。
[编辑:忘记的空间regex]
ASCII/整数码为这些文字将超出正常字母的范围。寻求和替换空符。串具有替代方法,我相信。
无论是使用一个黑名单的东西,你不想,或最好的白色列表(设定)。有一个白色名单你迭代串而仅仅复制信,在你的白名单的结果串。你说的去除和你一样,是具有两个指一个你从中读取(R)和一个你写信给(W):
I Donââ‚
W R
如果逗号在你的白名单然后你会在这种情况下阅读的逗号,并把它写在那里×然后提前两个指针。UTF-8是一个多字节的编码,所以你前进的指针可能不只是添加到地址。
C一种容易的方式得到一个白色列通过使用一个预先定义的职能(或宏):isalnum,isalpha,isascii,isblank公,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper,isxdigit.在这种情况下你送了一个白色列函数,而不是一种设置的课程。
通常当我看到数据就像你我寻找记忆的腐败,或者证据表明的编码我希望是不同于一个数据输入。
/艾伦
我有同样的问题有多余的垃圾扔在通过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.万圣节。仪配.dif>仪配.ascii。dif
如果串具有的任何垃圾的日期,这是好的方式消除这些垃圾的日期
string InputString = "This is grate kingdom¢Ã‚¬â";
string replace = "’";
string OutputString= Regex.Replace(InputString, replace, "");
//OutputString having the following result
它的工作对我很好,谢谢你找的这种审查。