【问题标题】:Character looks like ASCII 63 but isn't so I can't remove it字符看起来像 ASCII 63 但不是所以我不能删除它
【发布时间】:2014-11-08 10:11:07
【问题描述】:

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

"�"c

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

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

【问题讨论】:

  • 尝试AscW 获取Unicode 值。
  • 好吧,我们不能告诉你它是什么,因为你没有发布文件......打开你的十六进制编辑器来确定。当您有一个不在字体内的字符时,该问号符号就会出现。
  • @RaymondChen,当我尝试使用 AscW 评估字符时,它显示“无法转换为整数”。
  • 只要我知道如何删除它,我就很高兴。这解决了我的问题 - 如果你想把它作为我可以接受的答案:)。

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


【解决方案1】:

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

    用途:

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

    代替:

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

    它解决了问题。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我正在编写一次性代码,我不会深入挖掘。你的回答解决了我的问题,所以我很高兴:)。
      • 另外,你在ChrW(&HFFFFD)多了一个F,我觉得应该是ChrW(&HFFFD)(你是这么写的)
      • 我认为数据来自网站 asoiaf.westeros.org,直接复制到电子表格中,然后复制到文本文件中。问题一定出在网站上,因为我在 Calc 中遇到了同样的问题。无论如何,一次性代码:P.
      • 当然,至少有 6 个地方可能会出错,其中 3 个是您无法控制的。最后两个是最可疑的顺便说一句,文本文件不太擅长了解文本的编码。除非它有 BOM,否则会长期丢失。也在服务器端:)
      • 服务器端:文本文件 => dbase => Web 服务器。客户端:互联网 -> 浏览器 => 文本文件 => 您的应用程序。您可以轻松添加更多内容,将数据从一种格式转换为另一种格式,让 很多 程序员忙于工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多