2014-08-27 97 views
1

有一些问题从字符串中删除未知的错误字符。它显示为一个盒子(表示我选择的字体中不可显示的字符)。在VB.NET中从输入字符串中删除未知的错误字符

我已经尝试了多种方式删除它,最成功的是使用正则表达式来删除任何不是允许的字符。这工作。问题是有许多允许的字符,基本上是任何东西,并且考虑到将会看到的广泛的输入,我可能无法解释所有这些字符。此外,性能需要迅速(其基本上是一个滚动控制台窗口)。

是否有任何其他方式来格式化字符串以删除这些不可溶字符?

我正在使用WPF文本框来显示文本,VB.net作为后端代码。

编辑:忘了补充说,具有特殊字符的字符串不能从文本框复制到剪贴板。所以我不能把它放在另一个程序中,并确定它是什么字符。

这里举例:

+1

这些坏字是怎么进入的?什么使它成为“坏人物”? – RBarryYoung 2014-08-27 15:56:05

+0

错误的字符被提供数据的设备添加。我无法控制来自它的格式。是什么让他们变坏是因为我的字体无法显示它们,因此它们显示为占位符或空格,并且无法复制到剪贴板。 – 2014-08-27 15:57:39

+0

你可以在你的代码中识别这些字符,以找出它们是什么。 '对于每个c作为MyString中的字符...' – 2014-08-27 15:59:49

回答

0

原来我的问题是在我的琴弦ASCII(0)空字符。我遇到的麻烦是“ASC”功能似乎不想打印它们。我设法使用像下面的[\ x00- \ x07]正则表达式来跟踪它们,并使用正则表达式replace来替换所有匹配的值为空字符串。我减少了范围,直到我找到了正确的字符并仅替换了该字符。

我鼓励任何有类似问题的人考虑使用正则表达式来匹配一组字符串。

1

以下正则表达式会将您的字符串清理为严格的ASCII字符集。

string plainText = Clipboard.GetText(TextDataFormat.Text); 

// Allow ASCII base - https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) for readability below or equivalently https://en.wikipedia.org/wiki/ASCII 

//non-printable characters range (\u0000-\u001F) 

//remove "bad" non-printable control characters except Horizontal Tab, Line Feed, Carriage Return 
//\uxxxx is unicode for the character, make 1st link easily translated. 

ascciiText = Regex.Replace(plainText, @"[\u0000-\u0008|\u000B-\u000C|\u000E-\u001F|\u0080-\u009F]", string.Empty); 

//remove everything outside strict ASCII only range and delete control character (U+007F) \u007F which is Deleted character 

asciiText = Regex.Replace(plainText, @"[^\u0000-\u007E]", string.Empty);