Soruyu doğru anlıyorsam, sonuçta yapmanız gereken, bir karakterin ANSI karakter aralığına düşüp düşmediğini belirlemektir (bir baytla gösterilebilir - 0 - 255). Excel, yorumlarda belirtildiği gibi bunu kolaylaştırmaz. tüm dizeleri'u dahili olarak UTF-16 olarak gösterir. Bu, VB4'ten sonra VBA Len
ve LenB
davranışlarının değiştiği problemiyle birleştirilir. Bu değişiklikten önce, Unicode veya ANSI girişi için farklı sonuçlar vermiş olurlardı. LenB
karakter başına hep 2 bayt dize bellek içi uzunluğu döndürdüğü için Şimdi, onlar aynı sonucu dönecektir hem. ANSI aralığını ayırt eden, 2 baytın daima sıfır olacağıdır.
StrConv
işlevi, bir dizenin ANSI olmayan karakterler içerdiğini kontrol etmenin bir yolunu sağlar - Byte
dizisine dönüştürebilir ve yüksek baytlardan herhangi birinin ayarlanıp ayarlanmadığını kontrol edebilirsiniz.
65 0 66 0 67 0 68 0
Bu sonuçlanır StrConv("ABCD", vbUnicode)
ile tekrar 2 byte , bu genişletmek için VBA'ın "Unicode dönüşüm" bir cilvesi kullanabilirsiniz: Örneğin, dize "ABCD" olarak VBA'ın belleğinde depolanır: Eğer (ıde yazmanız yolu yoktur çünkü olurdu) bir yerden dize "ΑΒΓΔ" aldı eğer karşılaştırma için
65 0 0 0 66 0 0 0 67 0 0 0 68 0 0 0
, bu kodlama bağlı bu sonuçlanabilir:
Eğer bir bayt dizisi bir kez 83 Yani, yapmanız gereken tek şey her byte kontrol edilir - Eğer sıfır olmayan bir değer bulmak, eğer ANSı'YE daralmış edilemez:
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
ise kodlama bağlıdır daima
Private Function ByteLength(test As String) As Long
If IsANSI(test) Then
ByteLength = Len(test)
Else
ByteLength = LenB(test)
End If
End Function
Not o bayt uzunluğu : İlgilendiğiniz her bunu 8 bite daralmış olabilir belirlemek kolayca sonra UTF-16 v ANSI, siz "bayt uzunluğu" yakalayabilir olduğunu. Belirli bir kodlamada dize uzunluğunu gerekiyorsa sabit bir genişlik kodlama olmadığı sürece, VBA çok doğal yardımcı olmak için gitmiyor (yani UTF-32, VBA olasılıkla zaten kasap), içine ulaşması gerekecek Windows API ve açıkça WideCharToMultiByte ile dönüştürün ve geri aldığınız şeyi görün. Bir VBA örnek here bulabilirsiniz.
DBCS dilinin kullanılıp kullanılmadığını belirlemeniz gerekir. Bu tespit edildikten sonra, çalışma sayfasından [LEN, LENB fonksiyonları] (https://support.office.com/en-us/article/LEN-LENB-functions-29236f94-cedc-429d-affd-b5e33d2c67cb) uzunluğu doğru olarak belirleyin. – Jeeped
@Jeeped - Bunun işe yaradığından emin değilim. Varsayılan bir DBCS dili ise, LENB ANSI aralığındaki karakterler için bile karakter başına 2 bayt döndürür. – Comintern
Bu nedenle, DBCS olmayan karakterlerin uzunluğunun ve DBCS karakterlerinin uzunluğunun sayımının sayısını istiyorsunuz. Belki AscW yardımcı olacaktır. – Jeeped