字符看起来像ASCII 63但不是这样我无法删除它

时间:2014-09-14 22:29:20

标签: vb.net ascii non-ascii-characters

我正在从文本文件中读取文本。文本文件必须读取的第一个字符串是“Algood”,并注意spaaaaaace。在记事本中,似乎这个字符串中有一个spaaaaaace,但事实并非如此。当我在Visual Studio的QuickWatch中测试第6个(从零开始的索引)字符时,它显示为:

"�"c

当我使用Asc函数获取ASCII码时,它告诉我ASCII码是63. 63是一个问号。但是当我测试以查看字符串是否包含ASCII 63时,它会测试为false。所以看起来字符串包含带有ASCII码63的字符,只有它没有,它包含一些其他字符,它们测试为ASCII码63.这是一个问题:如果我不这样做,我就无法删除该字符知道怎么称呼它。我可以删除最后一个字符,但文本文件中的每个字符串都不包含此字符。

enter image description here

问题是:如果不是问号,这个字符是什么,我怎样才能唯一识别,以便将其删除?

3 个答案:

答案 0 :(得分:6)

这是Unicode replacement character,U + FFFD,又名ChrW(&HFFFD)

永远不要使用Asc()或Chr(),它们是不能处理Unicode的传统VB6函数。将一个奇特的Unicode代码点传递给Asc()总是产生63,"?"c的字符代码,又名“我不知道你在说什么”。 完全"�"c相同的想法,但改为使用ASCII代码。

看到死亡的黑钻石总是坏消息,当字符串从基础字节值转换时出现问题。因为某些字节值没有产生有效字符。这是你真正应该寻找的,你总是想避免GIGO。 Garbage In Garbage Out是一个丑陋的数据损坏问题,没有赢家,只有受害者。你。

答案 1 :(得分:2)

我在Excel VBA中编写了以下函数,该函数将删除单个单元格的“黑菱形”。

最困难的事情是不要循环查找所有字段中的每个数字。我需要一种无需检查所有字段的所有数字即可识别黑色菱形的方法。

我使用了ADODB记录集,如果RS不接受该字符串,则意味着它包含无效字符。然后,它寻找ASC(63)=“?”,然后将其修整到没有黑色菱形的位置。

这项工作的原因是当它遍历字符串中的每个数字时,它将把黑色菱形识别为ASC =63。如果是真正的问号,它将被RS接受。

Private Function Correct_Black_Diamond(ByVal First_Address As Variant) As String
    Dim CheckDigit As Integer
    Dim Temp_string As String
    Dim temp_Rs As New ADODB.Recordset
        temp_Rs.Fields.Append "address", adChar, 9999
        temp_Rs.Open

        temp_Rs.AddNew
            On Error GoTo Further_Address_Check
            temp_Rs!Address = First_Address
        temp_Rs.Update

        Correct_Black_Diamond = First_Address
    Exit Function

Further_Address_Check:
        For CheckDigit = 1 To Len(First_Address)
            If Asc(Mid(First_Address, CheckDigit, 1)) = 63 Then
                Temp_string = Trim(Mid(First_Address, 1, CheckDigit - 1)) & Trim(Mid(First_Address, CheckDigit + 1, Len(First_Address)))
            End If
        Next CheckDigit
        First_Address = Temp_string
        Correct_Black_Diamond = First_Address
        Exit Function

End Function

答案 2 :(得分:0)

使用:

LDM_MSG.Replace(ChrW(8203), "") 

代替:

LDM_MSG.Replace(Chr(63), "")

它解决了这个问题。