我正在研究密码验证例程,并且惊讶地发现 VB 不认为 '*' 是每个 Char.IsSymbol() 检查的符号。这是 QuickWatch 的输出:
char.IsSymbol("*") False Boolean
MS 文档没有指定 IsSymbol 匹配哪些字符,但暗示此处包含标准数学符号。
有没有人有任何匹配所有标准美国特殊字符的好主意?
在此上下文中作为符号的字符:、 和UnicodeCategory.MathSymbol
来自UnicodeCategory.CurrencySymbol
命名空间。这些是分别指定为 Sm、Sc、Sk 和 So 的 Unicode 字符。所有其他字符返回。UnicodeCategory.ModifierSymbol
UnicodeCategory.OtherSymbol
System.Globalization
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;
}
}
或转换为 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
CheckSymbol
IsSymbol
使用给定字符的 Unicode 类别调用。
由于 属于*
类别OtherPunctuation
(您可以使用 进行检查char.GetUnicodeCategory()
),因此它不被视为符号,并且该方法正确返回False
。
要回答您的问题:使用char.GetUnicodeCategory()
来检查角色属于哪个类别,并决定是否将其包含在您自己的逻辑中。
如果您只需要知道该字符不是数字或字母,只需使用
!char.IsLetterOrDigit(c)
最好用
&& !char.IsControl(c)
也许你有编译器选项“严格”的,因为
Char.IsSymbol("*")
我收到编译器错误
BC30512: Option Strict On disallows implicit conversions from 'String' to 'Char'.
要在 VB.NET 中定义字符文字,必须将 ac 添加到字符串中,如下所示:
Char.IsSymbol("*"c)