Vb.net 字符看起来像ASCII 63,但不是';所以我可以';不要把它拿走

Vb.net 字符看起来像ASCII 63,但不是';所以我可以';不要把它拿走,vb.net,ascii,non-ascii-characters,Vb.net,Ascii,Non Ascii Characters,我正在从文本文件中读取文本。文本文件必须读取的第一个字符串是“Algood”,并注意空格。在记事本中,该字符串中似乎有空格,但实际上没有。当我在Visual Studio的QuickWatch中测试第6个(从零开始的索引)字符时,它显示为: "�"c 当我使用Asc函数获取ASCII码时,它告诉我ASCII码是63。63是个问号。但当我测试字符串是否包含ASCII 63时,它测试为false。因此,字符串似乎包含ASCII码为63的字符,但它不包含,它包含其他一些测试为ASCII码63的字符。

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

"�"c
当我使用
Asc
函数获取ASCII码时,它告诉我ASCII码是63。63是个问号。但当我测试字符串是否包含ASCII 63时,它测试为false。因此,字符串似乎包含ASCII码为63的字符,但它不包含,它包含其他一些测试为ASCII码63的字符。这是一个问题:如果我不知道该怎么称呼这个角色,我就不能删除它。我可以删除最后一个字符,但不是文本文件中的每个字符串都包含此字符

问题是:如果这个字符不是问号,那么它是什么?我如何唯一地识别它以便删除它?

它是,U+FFFD,aka
ChrW(&HFFFD)

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

看到死亡的黑钻石回来总是一个坏消息,当字符串从底层字节值转换时出现了一些错误。因为某些字节值没有生成有效字符。这是您真正应该寻找的,您总是希望避免GIGO。垃圾中的垃圾是一个丑陋的数据损坏问题没有赢家,只有受害者。你。

使用:

LDM_MSG.Replace(ChrW(8203), "") 
而不是:

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

它解决了这个问题。

我在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

请尝试
AscW
获取Unicode值。因为您没有发布文件,所以我们无法告诉您该值是什么……请打开十六进制编辑器以确定答案。如果字体中没有字符,则会显示该问号。@RaymondChen,它说“无法转换为整数”“当我尝试使用
AscW
评估角色时。只要我知道如何删除它,我就很高兴。这就解决了我的问题——如果你想把它作为一个我可以接受的答案:)。我正在编写一次性代码,我不打算深入挖掘。你的回答解决了我的问题,所以我很高兴:)。另外,你在
ChrW(&HFFFFD)
中有一个额外的F,我认为应该是
ChrW(&HFFFD)
(这是你第一次写的)。我认为数据来源于一个网站asioaf.westeros.org,直接复制到一个电子表格中,然后复制到一个文本文件中。问题一定出在网站上,因为我在Calc中也遇到了同样的问题。在任何情况下,一次性代码:P。当然,至少有6个地方可能出现错误,其中3个你无法控制。最后两个是最可疑的顺便说一句,文本文件不太善于知道文本的编码。除非它有一个长期丢失的BOM表。同样在服务器端:)服务器端:text file=>dbase=>web服务器。客户端:互联网->浏览器=>文本文件=>您的应用程序。您可以轻松地添加更多数据,将数据从一种格式转换为另一种格式会让许多程序员忙得不可开交。