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

Algorithm 如何从字符串中删除这些类型的符号(垃圾)?,algorithm,string,unicode,Algorithm,String,Unicode,想象一下,我有C中的字符串:我看不见你 我想删除或替换这些符号 如何执行此操作?这些字符的ASCII/整数代码将超出正常的字母范围。查找并替换为空字符。我相信字符串有一个替换方法。这些字符的ASCII/整数代码将超出正常的字母范围。查找并替换为空字符。我相信String有一种替换方法。考虑Regex.Replaceyour_String,Regex,-这就是我使用的方法。考虑Regex.Replaceyour_String,Regex,-这就是我使用的方法 "I Don’t see

想象一下,我有C中的字符串:我看不见你

我想删除或替换这些符号


如何执行此操作?

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

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

考虑Regex.Replaceyour_String,Regex,-这就是我使用的方法。

考虑Regex.Replaceyour_String,Regex,-这就是我使用的方法

"I Don’t see ya..".Replace( "’", string.Empty);
那垃圾最初是怎么进入那里的?这才是真正的问题


那垃圾最初是怎么进入那里的?这才是真正的问题。

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

char.IsLetterOrDigit;
请再给我一些其他的,比如

char.IsSymbol;
char.IsControl;

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

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,可以轻松获得白名单。在这种情况下,你发送了一个白名单函数,而不是一套当然

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


/艾伦

或者使用你不想要的东西的黑名单,或者最好使用白名单集。使用白名单,您可以迭代字符串,只将白名单中的字母复制到结果字符串。你说删除,你这样做的方式是有两个指针,一个从R读,一个写到W:

I Donââ‚
     W  R
如果逗号在白名单中,那么在本例中,您将读取逗号并将其写在Ã所在的位置,然后前进两个指针。UTF-8是一种多字节编码,因此,指针前进可能不仅仅是添加到地址

使用C,通过使用一个预定义的函数或宏:isalnum、isalpha、isascii、isblank、iscntrl、isdigit、isgraph、islower、isprint、ispunct、isspace、isupper、isxdigit,可以轻松获得白名单。在这种情况下,你发送了一个白名单函数,而不是一套当然

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


/Allan

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

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

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


不要忘记那个可怜的家伙的名字里有一个–。

删除任何非拉丁字符,你会故意破坏一些国际化支持


不要忘记那个可怜的家伙的名字里有一个–如果你真的要这么做,正则表达式可能是最好的解决方案


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

如果你真的必须这样做,请注册 不规则表达式可能是最好的解决方案


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

这个“垃圾”看起来很像有人将UTF-8数据解释为ISO 8859-1或Windows-1252,可能是重复的

Ã、是序列C3 A2、E2 82 AC、E2 84 A2

UTF-8 C3 A2=U+00E2=U UTF-8 E2 82 AC=U+20AC=€ UTF-8 E2 84 A2=U+2122=™ 然后我们再做一次:在Windows1252中,这个序列是E28099,所以字符应该是U+2019,右单引号'


您可以使用字节数组Encoding.UTF8和Encoding.GetEncoding1252进行多次传递,以正确地将垃圾转换回最初输入的内容。您需要检查您的处理过程,以找到UTF-8数据被错误解释为Windows-1252的两个位置。

该“垃圾”看起来很像有人将UTF-8数据解释为ISO 8859-1或Windows-1252,可能会重复

Ã、是序列C3 A2、E2 82 AC、E2 84 A2

UTF-8 C3 A2=U+00E2=U UTF-8 E2 82 AC=U+20AC=€ UTF-8 E2 84 A2=U+2122=™ 然后我们再做一次:在Windows1252中,这个序列是E28099,所以字符应该是U+2019,右单引号'


您可以使用字节数组Encoding.UTF8和Encoding.GetEncoding1252进行多次传递,以正确地将垃圾转换回最初输入的内容。您需要检查处理过程,以找到UTF-8数据被错误解释为Windows-1252的两个位置。

Regex.replaceThestring,[^a-zA-Z]

在C语言中就是这样做的,尽管正则表达式[^a-zA-Z]在大多数语言中都可以工作


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

regex.replace字符串[^a-zA-Z]

在C语言中就是这样做的,尽管正则表达式[^a-zA-Z]在大多数语言中都可以工作


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

如果字符串包含任何垃圾日期,这是删除这些垃圾日期的好方法

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

     //OutputString having the following result 

这对我来说很好,谢谢你看这篇评论。

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

     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<
这很正常

我遇到的另一个可行的工作建议是:
iconv-c-t ASCII<6s-2014.1031-238246.halloween.exf.dif>exf.ASCII.dif

我对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.halloween.exf.dif>exf.ASCII.dif

这很简单,但我认为不是最好的解决方案。我需要尽可能快的方法但谢谢你的主意。这很简单,但我认为不是最好的解决办法。我需要
以最快的方式:但是谢谢你的主意。好主意:我完全忘记了正则表达式:好主意:我完全忘记了正则表达式:@HalFas,这看起来像是一个编码问题。不幸的是,这可能是由于封闭源代码系统中的bug造成的,例如一个和唯一一个!Sparxsystems Enterprise Architect的XML导出中的许多属性在该公司的上海分公司经常被错误编码,从而阻止了它们对UML模型的更改在法国或欧洲被导入England@HalFas,这看起来像是一个编码问题。不幸的是,这可能是由于封闭源代码系统中的bug造成的,例如one和only one!Sparxsystems Enterprise Architect的XML导出中的一些属性在该公司的上海分公司经常被错误编码,从而阻止了它们对UML模型的更改在法国或英国被导入。卢卡斯:迈克的回答有帮助吗?卢卡斯:迈克的回答有帮助吗?