Excel 是否有一个简单的公式可以识别包含非 ASCII 字符的字符串?

Excel 是否有一个简单的公式可以识别包含非 ASCII 字符的字符串?

我知道使用clean公式,我可以清理一些非 ASCII 字符(例如除 #127 之外的其他不可打印 ASCII 控制字符 #0 到 #31、#129、#141、#143、#144 和 #157)

我还知道我可以用它SUBSTITUTE(D1,CHAR(127),"")来删除不可打印的 ASCII #127。

但是,我无法替换或识别 Excel 单元格内的非 ASCII 字符。

以下是一个简单的例子:

Burrell's Model
Burrell’s Model

请注意,第一行是普通 ASCII 字符串,而第二行包含非 ASCII 字符(撇号)。

我可以知道如何使用 Excel 查找非 ASCII 字符吗?

谢谢。

更新 1

根据 Bandrami 的评论如下:

In the broadest sense this is impossible; there are valid ASCII strings that are also valid UTF characters, so there's no way to ever know "for certain" (see the "Bush hid the facts" bug: en.wikipedia.org/wiki/Bush_hid_the_facts )

请问如何识别不属于以下 ASCII 范围的字符?

  • 小于 128
  • 不等于 255

答案1

MS Office 帮助似乎将撇号视为 CLEAN 应该捕获的字符,但它并没有在我的计算机上将其删除。

MS Office 帮助,从文本倒数第二段中删除空格和非打印字符

我发现最“简单”的方法是嵌套运行 SUBSTITUTE,它可以清除 CLEAN 函数无法捕获的所有内容。

来自一个旧的 google excel 小组

=SUBSTITUTE(SUBSTITUTE(F17,CHAR(141),""),CHAR(143),"") etc etc

答案2

好吧,这是“真正的 ASCII”部分的方法,可以对 255 和 127 进行轻微调整。它最多可检查单元格文本中的 10 个字符,但可以轻松地将其设置为任意长度,尽管如果检查每个单元格中的 20,000 个字符,而不是根据您的判断检查较小的、可能的数字,则需要更多时间运行。此外,它检查单元格 A1 时会考虑您要填充一列以匹配,因此如果要检查的文本在 A1:A20000 中,您将在 B1:B20000 中输入公式。(我还没有研究过是否可以以触发溢出的方式使用它,以便它为您填充列,而不必复制和粘贴。)

=TEXTJOIN("",TRUE,IFERROR(CHAR(IF(UNICODE(MID(A1,ROW(1:10),1))>127,"",UNICODE(MID(A1,ROW(1:10),1)))),""))

基本上,它使用UNICODE()函数(不是CODE()因为可能存在不在 <255 范围内的字符)来读取被检查的单元格中的每个字符。MID()用于一次隔离一个字符(最后一个参数的长度为 1),我们检查每个字符的方式是ROW(1:whatever number you choose)给它一个不止一个的起点。

然后我们测试结果与 127 的对比,为任何不在真实 ASCII 集中的字符生成“”。然后我们重新创建字符(CHAR(),我们可以安全地使用,因为没有它不能正确处理的结果。)以获得成功的结果,对于所有“”。这些错误由 处理,IFERROR()将它们重新变为“”。最后,TEXTJOIN()将它们连接在一起以给出我们想要的单个结果,而不是SPILLING

结果将为文本,但如果有单元格应为数字,则可以进一步处理它,方法是将其包装起来VALUE()以获取实际值或错误,然后IFERROR()在`VALUE() 失败时给出原始文本结果。因此,可能是数字的东西会以数字形式显示,其余的则以文本形式显示。

如果需要,可以使用 VBA 按照这种方法删除任何非 ASCII 数据(true 或 <=255,以二者为准),因为如果没有其他方法,VBA 始终可以运行您可以在单元格中写入的任何公式。这将使其透明(没有辅助列),并且 VBA 还可以将结果直接写入原始数据,这对于导入的数据(因此如果出现问题,仍可以原始形式使用)来说是一个不错的功能。对于输入的数据(如果出现问题,则无法重新加载)来说,这个功能不太好...

它还可以很容易地适应几种方式,以测试所选字符列表,而不是所有>127或>255的字符。或者可以适应保留特定字符。

答案3

将其转储到 csv 并通过 unix 命令 cat -v 运行。非 ASCII 字符将以 M- 符号显示,因此只需 grep 查找 M- 即可。

答案4

我不完全清楚你想要什么,虽然你清楚地说明了工作表函数,但我提供这个 VBa 代码,因为它可能将更加可定制...

根据ASCII,它的十进制值大于 127(实际值无关紧要)...所以,此代码检查每个字符的值,如果大于 127,则将其标记...这意味着您需要查看链接以查看哪些字符是可以使用的“OK”字符。

Sub Sheet2_Button1_Click()


    Dim rCell As Range
    Dim rRng As Range

    Set rRng = Range("A1:D8")

    For Each rCell In rRng.Cells
        Debug.Print rCell.Address & " --- " & rCell.Value
        Dim s As String
         s = rCell.Value
         
        For i = 1 To Len(s)
        
             Dim c2 As String
             Dim ascInt As Integer
             
             c2 = Mid(s, i, 1)
             ascInt = asc(Mid(s, i, 1))
             
             If (ascInt > 127) Then
                 MsgBox ("Cell " & rCell.Address & " has a " & c2)
             End If
             
        Next i
         
    Next rCell

End Sub

因此,如您所见,我在一张小表格中使用了 2 个示例。我运行宏,每次出现该字符时,它都会显示在消息框中

在此处输入图片描述

相关内容