【问题标题】:string filter: detect non-ASCII signs字符串过滤器:检测非 ASCII 符号
【发布时间】:2011-01-01 06:09:54
【问题描述】:

我正在创建一个将输入字符串发送到移动设备的应用程序。有些设备在编码特殊字符时存在问题,所以我想创建一个过滤器,不允许 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 符号?

谢谢!

【问题讨论】:

    标签: .net string encoding


    【解决方案1】:

    我假设您需要可打印的 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
      

      【讨论】:

      • 没有比这更简单的了。
      • 您可能也不想将 \u0000 发送到手机。我想知道如果你也丢弃\u0001-\u0008\u000b\u000c\u000f-\u001f,会损失多少。 \u0009 (TAB)、\u000a (CR) 和 \u000d (LF) 是唯一合理的 ASCII 控制字符。
      【解决方案3】:

      你可以这样做:

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

      我不确定您是否真的只想删除最后输入的字符 - 考虑剪切和粘贴整个非 ascii 字符串...

      【讨论】:

        猜你喜欢
        • 2016-04-09
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 2015-07-01
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多