我正在使用Excel vba处理包含Unicode组合字符的字符串。我需要将字符串拆分成一个字符数组......很简单。我遇到的问题是我需要角色组。也就是说,字符与它们的组合字符。如何使用Excel vba将字符串拆分为字符组+组合字符?
答案 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
此代码不考虑三个主要内容:
"a" + ChrW(&H35C) + "b"
。在这种情况下,您将不得不写一些额外的条件。unicode()
数组中会有空格。在这种情况下,您必须ReDim Preserve
使用unicodeLength
释放一些空格,或使用unicodeLength
作为您的上限。了解更多信息 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