想象一下我在 C# 中有字符串:“我没看到你……”
我想删除(替换为无等)这些“’”符号。
我该怎么做呢?
那个“垃圾”看起来很像有人将 UTF-8 数据解释为 ISO 8859-1 或 Windows-1252,可能会重复。
¢ 是序列 C3 A2、E2 82 AC、E2 84 A2。
然后我们再做一次:在 Windows 1252 中,这个序列是 E2 80 99,所以字符应该是 U+2019,右单引号 (')
您可以使用字节数组、Encoding.UTF8 和 Encoding.GetEncoding(1252) 进行多次传递,以正确地将垃圾变回最初输入的内容。您将需要检查您的处理以找到 UTF-8 数据被错误地解释为 Windows-1252 的两个地方。
"I Don’t see ya..".Replace( "’", string.Empty);
那个垃圾是怎么进来的?这才是真正的问题。
通过删除任何非拉丁字符,您将故意破坏一些国际化支持。
别忘了那个名字里有一个“â”的可怜人。
对于处理使用标准字符编码存储在数据库中的 Windows 字符集的字符编码问题,这看起来令人不安地熟悉。我看到有人投票否决了威尔,但他说得有道理。您可能正在解决眼前的问题,但如果这是问题,字符组合是无限的。
如果你真的必须这样做,正则表达式可能是最好的解决方案。
不过,我强烈建议您考虑一下为什么必须这样做 - 至少您列出的某些不受欢迎的字符在其他语言中是完全有效且有用的,并且仅将它们过滤掉很可能会惹恼您的某些人国际用户。作为一个瑞典人,我无法强调我多么讨厌无法正确处理我们的 å、ä 和 ö 字符的系统。
考虑 Regex.Replace(your_string, regex, "") - 这就是我使用的。
依次测试每个字符以查看它是否是有效的字母或数字字符,如果不是,则将其从字符串中删除。性格测试很简单,用...
char.IsLetterOrDigit;
请还有其他各种,例如...
char.IsSymbol;
char.IsControl;
Regex.Replace("字符串", "[^a-zA-Z ]","");
这就是您在 C# 中的做法,尽管该正则表达式 ([^a-zA-Z ]) 应该适用于大多数语言。
[编辑:忘记了正则表达式中的空格]
这些字符的 ASCII / 整数代码将超出正常的字母范围。查找并替换为空字符。我相信 String 有一个 Replace 方法。
要么使用您不想要的东西的黑名单,要么最好使用白名单(设置)。使用白名单,您可以遍历字符串并仅将白名单中的字母复制到结果字符串中。你说删除,你这样做的方式是有两个指针,一个从 (R) 读取,一个从 (W) 写入:
I Donââ‚
W R
如果逗号在您的白名单中,那么在这种情况下,您将读取逗号并将其写入 Ã 的位置,然后将两个指针都推进。UTF-8 是一种多字节编码,因此您推进指针可能不仅仅是添加到地址。
使用 C 语言是一种通过使用预定义函数(或宏)之一来获取白名单的简单方法:isalnum、isalpha、isascii、isblank、iscntrl、isdigit、isgraph、islower、isprint、ispunct、isspace、isupper、isxdigit。在这种情况下,您发送的是一个白名单功能而不是一组课程。
通常当我看到像你这样的数据时,我会寻找内存损坏,或者有证据表明我期望的编码与输入数据时使用的编码不同。
/艾伦
如果 String 有任何垃圾日期,这很好地删除那些垃圾日期
string InputString = "This is grate kingdom¢Ã‚¬â";
string replace = "’";
string OutputString= Regex.Replace(InputString, replace, "");
//OutputString having the following result
它对我很好,感谢您查看此评论。
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<
这是正常的!!!
One other actionable, working suggestion I ran across: iconv -c -t ASCII < 6s-2014.1031-238246.halloween.exf.dif > exf.ascii.dif