如何确定字母是否在A-Z或数字0-9的范围内?我们收到了一些损坏的数据“I_999Š=ÄÖÆaðøñòòñ”。
我以为我可以使用Char.IsLetterOrDigit(“Š”)来识别来自“I_999Š”的损坏数据,但是这意外地返回true。我需要陷入这种想法吗?
答案 0 :(得分:12)
我不禁注意到每个人似乎都错过了真正的问题:您的数据“损坏”似乎是一个明显的字符编码问题。因此,无论您对数据做什么,您都会(错误地)处理症状并忽略根本原因。
具体而言,您似乎试图将收到的二进制BYTES解释为ASCII文本,而这些BYTES几乎肯定是为了表示编码为ASCII以外的其他文本。
您应该找出哪些字符编码适用于您收到的文本字符串。然后,您应该在应用适当的字符编码转换时读取该数据。
你应该阅读Joel Spolsky的文章,强调"There Ain't No Such Thing As Plain Text."
答案 1 :(得分:5)
有两种快速选择。第一种是使用正则表达式,第二种是使用Asc()函数来确定Ascii值是否在这些允许字符的范围内。我个人会使用Asc()来实现这个目标。
答案 2 :(得分:2)
应该是:
if (Regex.IsMatch(input, "[A-Za-z0-9]"))
{
// do you thang
}
答案 3 :(得分:1)
For Each m As Match In Regex.Matches("I_999Š=ÄÖÆaðøñòòñ", "[^A-Z0-9]")
'' Found a bad character
Next
或
For Each c As Char In "I_999Š=ÄÖÆaðøñòòñ"
If Not (c >= "A"c AndAlso c <= "Z"c OrElse c >= "0"c AndAlso c <= "9"c) Then
'' Found a bad character
End If
Next
修改强>
说出来,我会解决它。我注意到我遗漏了一个“然后”(现在修复),但我打算将其作为伪代码。
答案 4 :(得分:1)
您可以使用正则表达式过滤掉不良字符...(如果您只需要检测它,请使用Regex.IsMatch)
str = Regex.Replace(str, "[^A-Za-z0-9]","", RegexOptions.None);
答案 5 :(得分:1)
确保处理可打印ASCII字符的唯一方法是,无论程序中的编码,甚至是相关字符串中的编码,都要检查每个字符的合法值是否介于32和126之间(127 =删除 - 实际上并不是一个可打印的角色。
即
Public Module StringExtensions
<Extension()>
Public Function IsASCII(inString As String, Optional bPrintableOnly As Boolean = True) ' 127 = Delete (non-printing) < 32 = control characters also, non-printing
Dim lowerLimit As Int32 = If(bPrintableOnly, 32, 0)
Dim upperLimit As Int32 = If(bPrintableOnly, 127, 128)
For Each ch In inString.ToCharArray()
If Not Asc(ch) < upperLimit OrElse Asc(ch) < lowerLimit Then
Return False
End If
Next
Return True
End Function
End Module
答案 6 :(得分:0)
使用Asc(char)函数。它返回0到255之间的ANSI字符代码。检查ANSI Character Codes Chart
答案 7 :(得分:0)
请尝试以下代码:
NOT isNumeric(char)