通过组合字符组

时间:2018-02-16 02:08:02

标签: excel vba unicode

我正在使用Excel vba处理包含Unicode组合字符的字符串。我需要将字符串拆分成一个字符数组......很简单。我遇到的问题是我需要角色组。也就是说,字符与它们的组合字符。如何使用Excel vba将字符串拆分为字符组+组合字符?

1 个答案:

答案 0 :(得分:0)

VBA没有直接的功能来处理你想要的组合字符。相反,你必须使用一些代码来解决问题。事实上,它不是VBA特定的问题,请阅读https://eev.ee/blog/2015/09/12/dark-corners-of-unicode/#combining-characters-and-character-width

以下代码将尝试处理最常见的组合字符问题,并且与变音符号有关(变量unicode()将存储您需要的分割的unicode字符串)

当然,组合字符可以远离标记,例如ae作为一个独特的字母或ß,也可以写成ss。

Sub Test()
    Dim r As Range
    Set r = ActiveSheet.Range("A1")

    ' Set some combined chars in A1 cell
    r = "a" + ChrW(&H300)
    r = r + "e" + ChrW(&H301)
    r = r + "i" + ChrW(&H305)
    r = r + "o" + ChrW(&H300)
    r = r + "u" + ChrW(&H300)


    ' Store the combined chars from cell A1 to str
    Dim str As String
    str = r
    ' Length, counting the individual characters in string
    Dim strLen As Integer
    strLen = Len(str)


    ' Each element in unicode() will contain combined chars
    Dim unicode() As String
    ReDim unicode(strLen)

    ' Length, counting the combined characters in string
    Dim unicodeLength As Integer
    unicodeLength = 0


    ' Split str into unicode()
    Dim char As Integer
    For i = 1 To strLen
        char = AscW(Mid(str, i, 1))

        unicode(unicodeLength) = unicode(unicodeLength) + ChrW(char)

        If i < strLen Then
            'If it is not the last char, check if
            'the following char is a combining diacritical mark
            'and if so, do not increment the length
            char = AscW(Mid(str, i + 1, 1))
            If Not (char >= &H300 And char <= &H36F) Then
                unicodeLength = unicodeLength + 1
            End If
        Else
            unicodeLength = unicodeLength + 1
        End If
    Next i


    ' Fill B column with 1 combined char per row
    For i = 1 To unicodeLength
        ActiveSheet.Range("B" & i) = unicode(i - 1)
    Next i
End Sub

此代码不考虑三个主要内容:

  1. 除了(U + 0300到U + 036F)之外还有更多(稀有)unicode字符
  2. 一些变音符号(如U + 035C到U + 0362的那些)将两个字符连接在一起,即a͜b"a" + ChrW(&H35C) + "b"。在这种情况下,您将不得不写一些额外的条件。
  3. 如果有一些变音符号,unicode()数组中会有空格。在这种情况下,您必须ReDim Preserve使用unicodeLength释放一些空格,或使用unicodeLength作为您的上限。
  4. 了解更多信息 https://en.wikipedia.org/wiki/Combining_Diacritical_Marks

      

    结合变音符号(0300-036F),从版本1.0开始,用   后续版本中的修改低至4.1

         

    组合扩展的变音符号(1AB0-1AFF),版本7.0

         

    结合变音标记补充(1DC0-1DFF),版本4.1至5.2

         

    将符号的变音符号(20D0-20FF)与版本1.0相结合,并进行了修改   在后续版本中降至5.1

         

    将半标记(FE20-FE2F),版本1.0,以及后续版本中的修改结合到8.0