Wenn ich die Frage richtig verstehe, müssen Sie letztendlich feststellen, ob ein Zeichen in den ANSI-Zeichenbereich fällt (kann durch ein Byte dargestellt werden - 0 bis 255). Excel macht das nicht so einfach wie in den Kommentaren erwähnt. Weder macht VBA, das darstellt, alle Strings intern als UTF-16. Dies wird durch das Problem erschwert, dass sich das Verhalten der VBA Len
und LenB
nach VB4 geändert hat. Vor dieser Änderung hätten sie unterschiedliche Ergebnisse für die Unicode- oder ANSI-Eingabe zurückgegeben. Nun werden beide das gleiche Ergebnis zurückgeben, da LenB
die In-Memory-Länge der Zeichenfolge zurückgibt, die immer 2 Bytes pro Zeichen ist. Was den ANSI-Bereich unterscheidet, ist, dass das 2. Byte immer Null ist.
Die StrConv
Funktion bietet eine Möglichkeit zu überprüfen, ob eine Zeichenfolge Nicht-ANSI-Zeichen enthält - Sie können in ein Byte
Array konvertieren und überprüfen, ob eines der hohen Bytes festgelegt sind. Zum Beispiel wird die Zeichenfolge „ABCD“ in VBA Speicher gespeichert, wie:
65 0 66 0 67 0 68 0
Sie eine Marotte von „Unicode-Konvertierung“ VBA verwenden können diese wieder auf 2 Bytes zu erweitern mit StrConv("ABCD", vbUnicode)
, die dazu führt:
65 0 0 0 66 0 0 0 67 0 0 0 68 0 0 0
zum Vergleich, wenn Sie die Zeichenfolge „ΑΒΓΔ“ von irgendwo abgeholt (die Sie haben würden, weil es keine Möglichkeit gibt es in der IDE zu geben), könnte es in dieser Folge in Abhängigkeit von der Codierung:
Wenn
Private Function IsANSI(test As String) As Boolean
Dim bytes() As Byte, i As Long
bytes = StrConv(test, vbUnicode)
For i = 1 To UBound(bytes) Step 2
If bytes(i) <> 0 Then
IsANSI = False
Exit Function
End If
Next i
IsANSI = True
End Function
: - 83
Also, wenn Sie einen Byte-Array haben, alles, was Sie tun müssen, ist jeden zweiten Byte, wenn Sie nicht-Null-Wert finden, kann es nicht zu ANSI verengt werden alles, was Sie über Pflege ist UTF-16 v ANSI, können Sie die „Byte Länge“ leicht greifen, nachdem Sie auf 8 Bits bestimmen kann verengt werden:
auf der Codierung
Private Function ByteLength(test As String) As Long
If IsANSI(test) Then
ByteLength = Len(test)
Else
ByteLength = LenB(test)
End If
End Function
Beachten Sie, dass Byte Länge immer abhängt. Wenn Sie die Länge der Zeichenfolge in einer bestimmten Codierung benötigen, VBA wird Ihnen nicht viel nativ helfen, es sei denn, es ist eine Codierung fester Breite (dh UTF-32, die VBA wahrscheinlich bereits geschlachtet), müssen Sie in die erreichen Windows-API und konvertieren Sie es explizit mit WideCharToMultiByte und sehen, was Sie zurückbekommen. Sie finden ein VBA-Beispiel here.
Sie müssen feststellen, ob eine DBCS-Sprache verwendet wird. Sobald dies festgestellt wurde, kann eines der Arbeitsblätter [LEN, LENB-Funktionen] (https://support.office.com/de-de/article/LEN-LENB-functions-29236f94-ced-429d-affd-b5e33d2c67cb) Korrekt die Länge bestimmen. – Jeeped
@Jeeped - Ich bin mir nicht sicher, ob das funktioniert. LENB wird 2 Bytes pro Zeichen auch für Zeichen in dem ANSI-Bereich zurückgeben, wenn der Standard eine DBCS-Sprache ist. – Comintern
Sie möchten also die Länge von Nicht-DBCS-Zeichen und die Anzahl der Länge von DBCS-Zeichen zählen. Vielleicht wird AscW helfen. – Jeeped