Char.IsSymbol("*")是假的

Fra*_*mas 9 vb.net

我正在进行密码验证例程,并且惊讶地发现VB不会将'*'视为Char.IsSymbol()检查的符号.以下是QuickWatch的输出:

char.IsSymbol("*")  False   Boolean
Run Code Online (Sandbox Code Playgroud)

MS文档并不指定哪些字符被IsSymbol匹配,但不意味着标准的数学符号都包含在这里.

有没有人有匹配所有标准美国特殊字符的好主意?

Joh*_*mse 9

字符是在这种情况下符号:UnicodeCategory.MathSymbol,UnicodeCategory.CurrencySymbol,UnicodeCategory.ModifierSymbolUnicodeCategory.OtherSymbolSystem.Globalization命名空间.这些是分别指定为Sm,Sc,Sk和So的Unicode字符.所有其他字符返回False.

来自.Net来源:

internal static bool CheckSymbol(UnicodeCategory uc)
{
    switch (uc)
    {
        case UnicodeCategory.MathSymbol:
        case UnicodeCategory.CurrencySymbol:
        case UnicodeCategory.ModifierSymbol:
        case UnicodeCategory.OtherSymbol:
            return true;
        default:
            return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

或转换为VB.Net:

Friend Shared Function CheckSymbol(uc As UnicodeCategory) As Boolean
    Select Case uc
        Case UnicodeCategory.MathSymbol, UnicodeCategory.CurrencySymbol, UnicodeCategory.ModifierSymbol, UnicodeCategory.OtherSymbol
            Return True
        Case Else
            Return False
    End Select
End Function
Run Code Online (Sandbox Code Playgroud)

CheckSymbolIsSymbol使用给定char的Unicode类别调用.

由于*是在类别中OtherPunctuation(您可以检查char.GetUnicodeCategory()),它不被视为符号,并且方法正确返回False.

回答你的问题:char.GetUnicodeCategory()用来检查角色属于哪个类别,并决定是否将其包括在你自己的逻辑中.


Pav*_*elB 5

如果您只需要知道字符不是数字或字母,请使用 just

!char.IsLetterOrDigit(c) 
Run Code Online (Sandbox Code Playgroud)

最好有

&& !char.IsControl(c)
Run Code Online (Sandbox Code Playgroud)