【问题标题】:Remove Unicode characters in a String删除字符串中的 Unicode 字符
【发布时间】:2016-08-29 16:15:54
【问题描述】:

如何删除 VBA 中所有不属于 ASCII 类别的特殊字符?

这些是我的字符串中出现的一些符号。

Œ – Š š Ÿ ƒ

这样的角色还有很多。

这些不属于 ASCII 类别,您可以在此处看到 http://www.ascii.cl/htmlcodes.htm

我试过这样的

strName = Replace(strName, ChrW(376), " ")

【问题讨论】:

  • 术语:如您所知,Unicode 是 ASCII 的超集。但是,ASCII 字符位于所谓的“块”中,而不是Unicode category;特别是C0 Controls and Basic Latin 块。
  • 仅供参考 ChrW CharCode 参数是一个 Long,用于标识一个字符,但不允许值大于 65535(十六进制值 &HFFFF)。找到克服这一限制的系统方法可能具有一定的实际意义 - c.f. Get UniCode characters with CharCode greater hex FFFF 的六个解决方案,例如在 Unicode 块中 1F300-1F5FF "杂项符号和象形文字" :-)

标签: excel vba unicode non-ascii-characters


【解决方案1】:

不需要循环每个字符

也许迟到了,但也许对某人有帮助:

Public Function StripNonAsciiChars(ByVal InputString As String) As String
    Dim i As Integer
    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    With RegEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        .Pattern = "[^\u0000-\u007F]"
        StripNonAsciiChars = Application.WorksheetFunction.Trim(RegEx.Replace(InputString, " "))
    End With
End Function

【讨论】:

  • 哇...谢谢。没有 Application.WorksheetFunction.Trim 对我有用。工作表函数给我错误。
  • @Mabaega Ofc,您也可以使用Replace 函数,例如你可以放破折号,或者留下空格,这取决于你的需要。最近,从 MS Office 的 ClickToRun aproatch 开始,VBA 中的基本 excel 函数出现 1004 错误...
【解决方案2】:

您会对RegEx 解决方案感兴趣吗?

这个网站上有很多不同语言的示例 - 这是一个 C# 示例:How can you strip non-ASCII characters from a string? (in C#)

为 VBA 试试这个:

Private Function GetStrippedText(txt As String) As String
    Dim regEx As Object

    Set regEx = CreateObject("vbscript.regexp")
    regEx.Pattern = "[^\u0000-\u007F]"
    GetStrippedText = regEx.Replace(txt, "")

End Function

【讨论】:

  • 嘿,非常感谢,它有效。不确定所有条件和所有特殊的 Unicode 字符,但现在它运行良好。只是处理时间太长了。
  • 如果您要转换多个字符串,例如在一个循环中,则尝试定义一次模式并在循环内调用.Replace 函数。这可能有助于提高速度。
  • 谢谢 :) 这并没有减少多少时间,但无论如何它有助于减少一点时间。
  • 这是否涵盖了所有 unicode 或仅 0 到 7F?这适用于所有边界条件吗?请告诉我。
  • 它将替换任何不在 Unicode 范围 0 到 127 中的字符。
【解决方案3】:

下面试试

Function ClearUnwantedString(fulltext As String) As String
    Dim output As String
    Dim character As String
    For i = 1 To Len(fulltext)
        character = Mid(fulltext, i, 1)
        If (character >= "a" And character <= "z") Or (character >= "0" And character <= "9") Or (character >= "A" And character <= "Z") Then
            output = output & character
        End If
    Next
    ClearUnwantedString = output
End Function

Sub test()
    a = ClearUnwantedString("dfjŒœŠdskl")
End Sub

【讨论】:

  • 我正在使用类似的东西,但我的代码的 moto 不是这个。它应该允许 ASCII 的特殊字符,但只删除不属于 0 到 255 的 ASCII 码的特殊字符。
  • 我的字符串在excel表格中看起来像LPAIF,但是前面隐藏了一个在excel中看不到的Ÿ字符,但是它存在,所以字符串是ŸLPAIF。当我将“ŸLPAIF”作为静态字符串给出时,上面给出的一些解决方案有效,但在直接从 excel 中读取时无效。无论如何,我们现在有一个解决方案,感谢您的帮助。
  • 我努力从 VBA 中的字符串中删除奇怪的字符,这段代码对我很有帮助
  • 它删除字符串中的所有 unicode 字符。但是,它也会删除空格。
【解决方案4】:

假设你有:

那么下面的代码将从A1 中获取String,并且只让A2 中的ANSI(代码0 到255)通过。

Sub test()
 Dim s1 As String, s2 As String, c As String, i As Long, iAsc As Integer

 s1 = Range("A1").Value

 s2 = ""

 For i = 1 To Len(s1)
  c = Mid(s1, i, 1)
  iAsc = AscW(c)
  If iAsc <= 255 Then
   s2 = s2 & c
  End If
 Next

 Range("A2").Value = s2

End Sub

【讨论】:

  • 嗨,我试过这段代码,它用 ? 替换了 Ÿ在输出中。这仍然不能解决问题。
  • 我认为在阅读本身时 Ÿ 被阅读为?通过excel。 Ÿ 在 Excel 工作表中无论如何是不可见的。
  • 正如你在我的照片中看到的那样,“这个 Œ 是一个 Š testš . Ÿ ƒ Blubb。”是我工作表的实际内容。有了这个,我的代码就像我描述的那样工作。您在哪里看到“Ÿ”,然后在工作表中可见?
  • 当我将该字符串从 Excel 单元格复制粘贴到记事本时,我看到了 Ÿ。感谢您尝试提供帮助。我们现在有一个解决方案 Ambie。感谢您的努力。
【解决方案5】:

当您在即时窗口中写下以下内容时,您会得到什么?

?Replace("ŸŸŸŸ", ChrW(376), "ale")

我得到: 栀子花

【讨论】:

  • 是的,它对我的​​打印结果相同。我将 Ÿ 作为特殊字符,但是当在 Replace 方法中作为字符串传递时 strName = Replace(strName, ChrW(376), " "),其中 strName 最初是 ŸLPAIF 变为 ?LPAIF。然后该字符串转到写入文件方法,其中代码崩溃说“运行时错误'5'无效的过程调用或参数”。我觉得 ?新出的也不是普通的问号,而是一些特殊的字符。我想在我的动态字符串中替换它,而不是在静态字符串中替换为您显示的“ŸŸŸŸ”。
  • 嗨,我认为它在 Debug.Print 中工作,但是当使用 Ÿ 存在的单元格中的实际值时,它不会这样做。
【解决方案6】:

试试application.clean()

它将删除所有不可打印的字符

【讨论】:

  • 你能给我举个例子吗?我无法在 vba 的自动文本代码中找到任何 application.clean()。
  • 请看一下这个pasteboard.co/FtkoMrB.png 我也试过“strName = Clean(strName)”,但没有用。
  • 尝试使用 Application.WorksheetFunction.Clean("üäöaŠsd")。但这对您没有帮助,它仅适用于不可打印的字符。你的可以打印。
  • @Vityata 你是对的。这只是一个测试,看看你是否关注 xD :P 但是@Jeevan .clean 存在于worksheetfunction 下,但它也可以在application 下调用。我将把答案留在这里以供参考。
  • 我没有完全理解你的意思。 Intellisense 不会显示“application.clean”,但使用“application.worksheetfunction.clean”会显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2017-07-26
  • 1970-01-01
  • 2012-08-14
  • 2019-11-26
  • 2017-11-28
相关资源
最近更新 更多