Ich bin neu zu versuchen, Code in VBA zu schreiben, um WinAPI-Funktionen zu verwenden. Mit welcher Codierung arbeitet die Funktion WinAPI Normalize()? UTF-16 ist, was ich erwarten würde, aber das Folgende funktioniert nicht. Die Anzahl der Zeichen scheint nicht richtig berechnet zu sein, und der Versuch, eine normalisierte Zeichenfolge zu erstellen, stürzt nur Access ab.VBA String Normalisierung (über WinAPI)
'normFormEnum
'not random numbers, but from ...
'https://msdn.microsoft.com/en-us/library/windows/desktop/dd319094(v=vs.85).aspx
'for use in calling the Win API Function NormalizeString()
Public Enum normFormEnum
normFOther = 0
normFC = 1 'the W3C (Internet) required normalization format
normFD = 2
normFKC = 5
normFKD = 6
End Enum
'https://msdn.microsoft.com/en-us/library/windows/desktop/dd319093(v=vs.85).aspx
Private Declare Function NormalizeString Lib "Normaliz" (_
ByVal normForm As normFormEnum, _
ByVal lpSrcString As LongPtr, _
ByVal cwSrcLength As Long, _
ByRef lpDstString As LongPtr, _
ByVal cwDstLength As Long _
) As Long
Public Function stringNormalize(_
ByVal theString As String, _
Optional ByVal normForm As normFormEnum = normFC _
) As String
Dim nChars As Long
Dim newString As String
nChars = NormalizeString(normForm, StrPtr(theString), Len(theString), 0&, 0)
'prefill the string buffer so it can be altered shortly...
newString = String(nChars, " ")
Debug.Print nChars
'prints nChars, showing that it 3x the amount of characters.
'The following will crash the application....
' NormalizeString normForm, StrPtr(theString), Len(theString), StrPtr(newString), nChars
stringNormalize = newString
End Function
Stab im Dunkel: 'Len' gibt die Anzahl der * Zeichen * in der Zeichenfolge; Hast du stattdessen 'LenB' probiert, welches die Anzahl von * Bytes * in der Zeichenkette zurückgibt? VBA-Zeichenfolgen verwenden 2 Byte pro Zeichen. –
@ Mat'sMug: Die Funktion Len() gibt die Anzahl der UTF-16-Code-Einheiten zurück. Die LenB() - Funktion wird doppelt so groß sein und ein noch schlechteres Ergebnis liefern. – someprogrammer
'Len' gibt die Anzahl der ANSI-Zeichen in einer Zeichenfolge zurück. Dass dies UTF-16-Code-Einheiten entspricht, ist ein Zufall. –