字符串过滤:检测非ASCII字符

4
我正在创建一个应用程序,该应用程序将输入字符串发送到移动设备。一些设备在编码特殊字符方面存在问题,因此我想创建一个过滤器,不允许PC用户输入特殊字符。
该应用程序是用C# (.NET 3.5)编写的,我想将一个方法附加到按键事件上。伪代码如下:
private void checkTextBoxContent(TextBox txtEntry)
{
    if(txtEntry.Text contains non-ASCII sign)
    {
        show messageBox;
        remove the last entered character;
    }
}

有没有现成的方法可以检测ASCII /非ASCII符号,以便在条件中使用?

txtEntry.Text包含非ASCII符号吗?

谢谢!

3个回答

6

好的,您可以这样做:

public static bool IsAllAscii(string text)
{
    return text.All(c => c >= ' ' && c <= '~');
}

不过,我不确定您是否真的想要仅删除最后输入的字符 - 请考虑剪切和粘贴整个非 ASCII 字符串...


4

我假设您需要可打印的ASCII而不仅仅是ASCII,因此您可能希望将自己限制在0x20至0x7e代码点之间:

if (Regex.isMatch (str, @"[^\u0020-\u007E]", RegexOptions.None)) {
    ... Show message box here ...
    str = Regex.Replace (str, @"[^\u0020-\u007E]", string.Empty);
}

但我不确定消息框是正确的选择。这可能会变得非常烦人。更好的方法可能是在表单上设置一个错误控件,当用户输入无效字符时,您可以将其设置为错误消息(并发出哔声通知)。当用户输入另一个(有效)字符时,将该控件重置为空字符串。这似乎不那么显眼。


2
这是一个正则表达式选项(使用System.Text.RegularExpressions)。
    string s = "søme string";
    bool result = Regex.IsMatch(s, @".*[^\u0000-\u007F].*"); // result == true

就这么简单。 - JohnE
1
你可能也不想将 \u0000 发送到移动设备。如果你也丢弃了 \u0001-\u0008\u000b\u000c\u000f-\u001f,那么会有多少数据丢失呢?\u0009(TAB)、\u000a(CR)和\u000d(LF)是唯一合理的 ASCII 控制字符。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接