C# Don';不允许在文本框中使用日语字符

C# Don';不允许在文本框中使用日语字符,c#,winforms,unicode,textbox,C#,Winforms,Unicode,Textbox,确保用户不会在C#WinForms文本框中输入(或复制)日语字符的最佳方法是什么 问题是我们的软件将被德国、英国和日本用户使用。所有类型的字符和符号都处理得很好,但是日文字符似乎在底层持久性框架中造成了一些问题。您可以使用白名单吗?例如: bool IsValidInput(String input) { return input != null && input.All(c => IsValidLetter(c)); } bool IsValidLetter(c

确保用户不会在C#WinForms文本框中输入(或复制)日语字符的最佳方法是什么


问题是我们的软件将被德国、英国和日本用户使用。所有类型的字符和符号都处理得很好,但是日文字符似乎在底层持久性框架中造成了一些问题。

您可以使用白名单吗?例如:

bool IsValidInput(String input)
{
    return input != null && input.All(c => IsValidLetter(c));
}

bool IsValidLetter(char c)
{
     return Char.IsNumber(c) || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
} 
bool IsValidInput(字符串输入)
{
返回输入!=null&&input.All(c=>IsValidLetter(c));
}
bool-IsValidLetter(字符c)
{

return Char.IsNumber(c)| |(c>='A'&&c='A'&&c请阅读我的评论。我真的建议您修复持久性部分以正确工作。但由于这不能回答您的问题,您有两个选择:

  • 使用带有掩码和一些选项的。或编写自己的
    MaskedTextProvider
  • 或者:处理验证事件,并手动检查每个字符,以确保其不在日文unicode字符范围内

  • 虽然我同意之前的海报,因此不想做一个“我也是”的回答,但我想补充一些关于日本人输入“拉丁语”文本的内容。在99.99999%(是的,这是5个9,我们这里说的是Erlang式的可靠性;-)在这些情况下,即使他们输入拉丁字符的文本,比如铃木(一个普通的姓氏),你真正得到的是SUZUKI.Codepoints在
    FF20-FF60
    范围内。哎呀,我又弄坏了你的持久性引擎。惹恼了客户。因为他们不会理解你为什么拒绝他们完全正确的拉丁字符。或者他们认为…

    你只能对英语字符使用这个

    private void txtSmsMessage_TextChanged(object sender, EventArgs e)
            {
                //sadece latin karakterlerin girilmesi saglanıyor.
                string str = ((TextBox)sender).Text;
                byte[] key = null;
                if (!string.IsNullOrEmpty(str))
                {
                    key = Encoding.Unicode.GetBytes(str.Substring(str.Length - 1, 1));
                    if (Convert.ToInt32(key[1]) != 0 || (Convert.ToInt32(key[0]) < 32 && Convert.ToInt32(key[0]) > 127))
                    {
                        txtSmsMessage.Text = txtSmsMessage.Text.Substring(0, str.Length - 1);
                        txtSmsMessage.SelectionStart = txtSmsMessage.Text.Length;
                        return;
                    }
                }
    }
    
    private void txtSmsMessage_TextChanged(对象发送方,事件参数e)
    {
    //sadece latin karakterlerin girilmesi saglanıyor。
    字符串str=((文本框)sender).Text;
    字节[]键=空;
    如果(!string.IsNullOrEmpty(str))
    {
    key=Encoding.Unicode.GetBytes(str.Substring(str.Length-1,1));
    if(Convert.ToInt32(键[1])!=0 | |(Convert.ToInt32(键[0])<32和Convert.ToInt32(键[0])>127))
    {
    txtsmsessage.Text=txtsmsessage.Text.Substring(0,str.Length-1);
    txtSmsMessage.SelectionStart=txtSmsMessage.Text.Length;
    返回;
    }
    }
    }
    
    如果你想使用另一种语言,请检查此链接。

    你最好修复后端。如果你的日本用户不能在从你那里购买的软件中使用他们的母语,他们将被p.o.-ed。那么你应该修复底层的持久性解决方案。当然后端会尽快修复。不过,我需要一个工作解决方案,并且尽可能少的副作用“可能……”马特在我的办公室里大声笑着说,“我一个人。”。