获取我在进程中编写的字符的unicode

本文关键字:字符 unicode 进程 获取 | 更新日期: 2023-09-27 18:29:29

我在WindowForm中有Form。

我想捕获编写的特定字符(unicode)

我只想被允许用一种语言写作。

例如,我想在我的程序中只允许英语和希伯来语。

我怎么能这么做?当写了其他东西时,我该怎么处理??

我知道那里有

OnKeyPress

OnKeyDown

但我只能在写英文字符的情况下才能e.handle

我如何通过unicode或其他方式为任何语言做这件事?

提前感谢

获取我在进程中编写的字符的unicode

您可以使用KeyPress并检查字符的范围。你可以在这里查看范围表,例如

然后代码变得简单了(这都是未经测试的):

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    var unicodeValue = (int)e.KeyChar;
    if(unicodeValue >= 0 && unicodeValue <= 0x024F) // it's latin
      return;
    if(unicodeValue >= 0x0590 && unicodeValue <= 0x05FF) // it's hebrew
      return;
    // otherwise, don't allow it
    e.Handled = true;
}

当然,您可以创建一个表和辅助函数(并删除这两个ifs并将其全部放在一起),但我将把它留给您。

小心:这不处理复制&粘贴或在文本框中输入文本的其他方式(例如,抓住文本框句柄并发送WM_SETTEXT)。

如果您想禁止从键盘输入字符,KeyPress是可以的,但您应该始终在TextChanged上验证您的整个输入。

这可以用类似的东西来完成(同样,完全未经测试,直接写在堆栈溢出编辑器上,小心处理):

private bool IsCharAllowed(char c)
{
    var unicodeValue = (int)c;
    if(unicodeValue >= 0 && unicodeValue <= 0x024F) // it's latin
      return true;
    if(unicodeValue >= 0x0590 && unicodeValue <= 0x05FF) // it's hebrew
      return true;
    // otherwise, don't allow it
    return false;
}
private bool _parsingText = false;
private void textBox1_TextChanged(object sender, EventArgs e)
{
    // if we changed the text from within this event, don't do anything
    if(_parsingText) return;
    var textBox = sender as TextBox;
    if(textBox == null) return;
    // if the string contains any not allowed characters
    if(textBox.Text.Any(x => !IsCharAllowed(x))
    {        
      // make sure we don't reenter this when changing the textbox's text
      _parsingText = true;
      // create a new string with only the allowed chars
      textBox.Text = new string(textBox.Text.Where(IsCharAllowed).ToArray());         
      _parsingText = false;
    }
}

你也可以使用正则表达式,但老实说,我从来没有做过任何非拉丁unicode正则表达式,所以我在这方面无能为力。

PS:由于我发布的TextChanged事件会在有任何不允许的字符的情况下重建整个字符串(如果字符串足够长,这可能会变得很慢),所以除了处理的KeyPress之外,我还会有这个

PS2:防止重新进入并不是真正必要的,因为字符串在重新进入时是正确的,不会被修改,但我们避免了Any()检查(它在字符串的每个字符上迭代,如果字符串很长,可能会很慢)

您可以使用这样的正则表达式简单地验证输入的文本

RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"[^a-zA-Z]+", options);     
tempo = regex.Replace(tempo, @" ");

并在text_changed事件中捕获它。