Konwersja tekstu ASCII na format UTF8.
UTF-8 to system kodowania Unicode, wykorzystujący od 1 do 6 bajtów do zakodowania pojedynczego znaku, jest w pełni kompatybilny z ASCII. Format UTF8 zdominował cały internet. Większość stron internetowych kodowana jest w UTF8. Format ten, w porównaniu do standardu ISO 8859-2 zajmuje nieco więcej miejsca, ale daje o wiele, wiele większe możliwości prezentowania tekstu na stronach internetowych. I dlatego też, (moim skromnym zdaniem☺) niezbędna jest funkcja umożliwiająca konwersję tekstu z formatu Unicode na format UTF8.
Funkcja API WideCharToMultiByte (...) inaczej zadeklarowana.
Do konwersji tekstu z formatu Unicode na UTF8 skorzystam z funkcji WideCharToMultiByte(...), której opis znajduje się na stronie
WideCharToMultiByte(...).
Funkcja ta konwertuje ciąg znaków z formatu Unicode na ciąg znaków zgodny
z określoną stroną kodową ASCII, w tym także na format wielobajtowy np. UTF8.
Na stronie tej pisałem, że:
Po zmianie typów dwóch argumentów
• argument lpWideCharStr As String deklarujemy jako typ Long
• argument lpDefaultChar As String deklarujemy jako typ Long
i zadeklarowaniu funkcji WideCharToMultiByte(...) w poniższy sposób:
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As Long, _ ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As String, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As Long, _ ByVal lpUsedDefaultChar As Long) As Long
Funkcja konwertująca tekst z formatu ASCII na format UTF8.
⊗ Funkcja tekstAsciiToUTF8(ByVal sAscii As String) As String
- Konwertuje ciąg znaków z formatu Unicode (aktualnej strony kodowej ASCII) na ciąg znaków zgodny z wielobajtowym formatem UTF8.
- argumenty:
- sAscii
- wejściowy ciąg znaków ASCII do konwersji na format UTF8
- zwraca:
-
Zwraca ciąg znaków w formacie UTF8. Przy niepowodzeniu zwraca ciąg zerowej długości.
- autor: Zbigniew Bratko
- data: 22.01.2018
Option Compare Database Option Explicit #If VBA7 Then Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As LongPtr, _ ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As String, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As LongPtr, _ ByVal lpUsedDefaultChar As LongPtr) As Long #Else Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As Long, _ ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As String, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As Long, _ ByVal lpUsedDefaultChar As Long) As Long #End If Private Const CP_UTF8 As Long = 65001 Public Function tekstAsciiToUTF8(ByVal sAscii As String) As String Dim lLenUTF8 As Long Const WC_ERR_INVALID_CHARS = 128 Const ERROR_INVALID_FLAGS = 1004 ' pobierz wielkość potrzebnego buforu na wyjściowy ciąg znaków UTF8 lLenUTF8 = WideCharToMultiByte(CP_UTF8, 0&, StrPtr(sAscii), Len(sAscii), 0&, 0&, 0&, 0&) ' przygotuj bufor na przyjęcie ciągu po konwersji na UTF8 tekstAsciiToUTF8 = String(lLenUTF8, vbNullChar) ' konwertuj wejściowy ciąg na ASCII lLenUTF8 = WideCharToMultiByte(CP_UTF8, 0&, StrPtr(sAscii), Len(sAscii), _ tekstAsciiToUTF8, lLenUTF8, 0&, 0&) End Function
Inna postać funkcji konwertującej tekst z formatu ASCII na format UTF8
Do konwersji tekstu z formatu Unicode na UTF8 skorzystaliśmy z funkcji WideCharToMultiByte(...), której
opis znajduje się na stronie WideCharToMultiByte(...).
Funkcja ta konwertuje ciąg znaków z formatu Unicode na ciąg znaków zgodny z określoną stroną
kodową ASCII, w tym także na format wielobajtowy np. UTF8.
Wcześniej pisałem, że:
... po zmianie typów dwóch argumentów
• argument lpWideCharStr As String deklarujemy jako typ Long
• argument lpDefaultChar As String deklarujemy jako typ Long
udało mi się stworzyć ☺ funkcję konwertującą ciąg znaków z formatu Unicode (aktualnej strony kodowej ASCII) na format UTF8. Utrudnijmy sobie życie poprzez zmianę typów wszystkich argumentów na typ Long i wtedy spróbujmy stworzyć funkcję konwertującą tekst na format UTF8
• argument lpWideCharStr As String deklarujemy jako typ Long
• argument lpDefaultChar As String deklarujemy jako typ Long
• argument lpMultiByteStr As String deklarujemy jako typ Long
Nowa deklaracja funkcji WideCharToMultiByte(...)
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As Long, _ ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As Long, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As Long, _ ByVal lpUsedDefaultChar As Long) As Long
i trochę inna funkcja konwertująca ciąg znaków z formatu Unicode (aktualnej strony kodowej ASCII) na format UTF8.
I nowa funkcja konwertująca tekstStringToUTF8(...)
⊗ Funkcja tekstStringToUTF8(ByVal sAscii As String) As String
- Konwertuje ciąg znaków z formatu Unicode (aktualnej strony kodowej ASCII) na ciąg znaków zgodny z wielobajtowym formatem UTF8.
- argumenty:
- sAscii
- wejściowy ciąg znaków do konwersji na format UTF8
- zwraca:
-
Zwraca ciąg znaków w formacie UTF8. Przy niepowodzeniu zwraca ciąg zerowej długości.
- autor: Zbigniew Bratko
- data: 22.01.2018
Option Compare Database Option Explicit #If VBA7 Then Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As LongPtr, _ ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As LongPtr, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As LongPtr, _ ByVal lpUsedDefaultChar As LongPtr) As Long #Else Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As Long, _ ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As Long, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As Long, _ ByVal lpUsedDefaultChar As Long) As Long #End If Private Const CP_UTF8 As Long = 65001 Public Function tekstStringToUTF8(ByVal sAscii As String) As String Dim lLength As Long Dim arrCharsUTF8() As Byte Const WC_ERR_INVALID_CHARS = 128 Const ERROR_INVALID_FLAGS = 1004 ' pobierz potrzebną długość ciągu po konwersji lLength = WideCharToMultiByte(CP_UTF8, 0&, StrPtr(sAscii), Len(sAscii), 0&, 0&, 0&, 0&) ' przygotuj tablicę na przyjęcie przekonwertowanego ciągu UTF8 ReDim arrCharsUTF8(lLength) ' konwertuj wejściowy ciąg na UTF8 lLength = WideCharToMultiByte(CP_UTF8, 0&, StrPtr(sAscii), Len(sAscii), _ VarPtr(arrCharsUTF8(0)), lLength, 0&, 0&) ' konwertuj zwróconą tablicę znaków UTF8 na format Unicode tekstStringToUTF8 = StrConv(arrCharsUTF8, vbUnicode) End Function
Jak dla mnie, bardziej oczywista, przystępniejsza i krótsza jest funkcja tekstAsciiToUTF8.
Druga z przedstawionych funkcji tekstStringToUTF8(...), jest moim zdaniem bardziej skomplikowana.
Przygotowanie tablicy na wyjściowy ciąg znaków, potem konwersja zwróconej tablicę znaków UTF8 na ciąg znaków.
Zamieściłem tą funkcję, by nie przepadła w czeluściach mojego dysku ☺. Kto wie, może kiedyś się przyda.