9

我正在研究密码验证例程,并且惊讶地发现 VB 不认为 '*' 是每个 Char.IsSymbol() 检查的符号。这是 QuickWatch 的输出:

char.IsSymbol("*")  False   Boolean

MS 文档没有指定 IsSymbol 匹配哪些字符,但暗示此处包含标准数学符号

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

4

3 回答 3

9

在此上下文中作为符号的字符:、 和UnicodeCategory.MathSymbol来自UnicodeCategory.CurrencySymbol命名空间。这些是分别指定为 Sm、Sc、Sk 和 So 的 Unicode 字符。所有其他字符返回。UnicodeCategory.ModifierSymbolUnicodeCategory.OtherSymbolSystem.GlobalizationFalse

来自.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;
    }
}

或转换为 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

CheckSymbolIsSymbol使用给定字符的 Unicode 类别调用。

由于 属于*类别OtherPunctuation(您可以使用 进行检查char.GetUnicodeCategory()),因此它不被视为符号,并且该方法正确返回False

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

于 2013-02-20T13:55:49.203 回答
5

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

!char.IsLetterOrDigit(c) 

最好用

&& !char.IsControl(c)
于 2014-08-26T19:50:52.663 回答
0

也许你有编译器选项“严格”的,因为

Char.IsSymbol("*")

我收到编译器错误

BC30512: Option Strict On disallows implicit conversions from 'String' to 'Char'.

要在 VB.NET 中定义字符文字,必须将 ac 添加到字符串中,如下所示:

Char.IsSymbol("*"c)
于 2013-02-20T13:37:01.330 回答