Access

  MS Access 2010+  |  Aplication Programming Interface API  |   VBA 7.0



• API. Funkcje przetwarzające tekst.

Konwersja tekstu Ascii i UTF8 na format Unicode.

Cały Windows tak naprawdę na Unikodowym formacie tekstu stoi. Przed wyświetleniem tekstu na ekranie, jest on konwertowany na tekst zgodny z aktualną stroną kodową systemu Windows (u mnie „Windows 1250”).
Ale jeżeli mamy tekst w innym formacie (innej stronie kodowej) niż  aktualna strona kodowa systemu Windows to aby go poprawnie wyświetlić powinniśmy tekst ten przekonwertować na format Unicode (ciąg znaków UTF-16). System zapewni jego prawidłowe wyświetlenie, zgodnie z domyślną stroną kodową systemu Windows.

Częściej używane inne strony kodowe.

UTF8
Obecnie strony internetowe są najczęściej zapisywane w formacie UTF8, więc by odczytać poprawnie źródło strony musimy tekst z formatu UTF8 przekonwertować na format Unicode.
ISO 8859-2
Dawniej większość stron internetowych (poprawnie wyświetlanych) zapisywanych było w formacie ISO 8859-2, znane jako ISO Latin-2, bądź „środkowowschodnioeuropejski” i „wschodnioeuropejski” zestaw znaków. I tutaj jak zawsze, by odczytać poprawnie źródło strony musimy tekst z formatu ISO 8859-2 przekonwertować na format Unicode.
852
Strona kodowa 852 używana jest w wierszu poleceń cmd.exe.
Przykładowo:
po wywołaniu polecenia Dir i przekierowaniu zwracanego strumienia do pliku tekstowego:
Dir C:\Test\* /A:D /B /S > C:\Test\~Dir2File.txt
otrzymujemy plik wynikowy zawierający tekst zgodny ze stroną kodową 852. Przykładowy podfolder o nazwie „Gżegżółka” zapisany będzie jako „Gľegľ˘ˆka” a podfolder „Pójść” jako „P˘j˜†”
Tekst pliku wymaga więc konwersji na format Unicode.

No może teza o konieczności konwersji pliku zwracanego przez polecenie Dir niekoniecznie jest prawdziwa. Jeżeli przed wywołaniem polecenia Dir zmienimy domyślną stronę kodową interpretatora poleceń cmd.exe na 1250 za pomocą polecenia chcp 1250
to po wywołaniu polecenia:
Dir C:\Test\* /A:D /B /S > C:\Test\~Dir2File.txt
otrzymamy wynikowy plik zgodny ze stroną kodową Windows 1250.

Funkcja API MultiByteToWideChar (...)

Do konwersji tekstu na format Unicode (UTF-16) możemy użyć funkcji API MultiByteToWideChar(...) która konwertuje tekst wejściowy ze strony kodowej ASCII, lub UTF8 na format Unicode (ciąg znaków UTF-16). Konwertowany tekst wejściowy nie musi być zestawem znaków wielobajtowych.

Opis funkcji API MultiByteToWideChar (...)

Teoretycznie deklaracja funkcji MultiByteToWideChar(...) powinna mieć postać jak poniżej, tak jak przedstawiona wcześniej funkcja. Ale tylko „teoretycznie” i również „teoretycznie” taką powinna mieć postać. Piszę „teoretycznie”, gdyż nie za bardzo udało mi się zastosować funkcję MultiByteToWideChar(...) zadeklarowaną w poniższy sposób.

Private Declare Function MultiByteToWideChar Lib "kernel32" ( _
	ByVal CodePage As Long, _
	ByVal dwFlags As Long, _
	ByVal lpMultiByteStr As String, _
	ByVal cchMultiByte As Long, _
	ByVal lpWideCharStr As String, _
	ByVal cchWideChar As Long) As Long
	
  • argumenty:
    • CodePage
    • Określa stronę kodowa na którą ma być przekonwertowany tekst. Argument można ustawić na wartość dowolnej strony kodowej, dostępnej w systemie operacyjnym. Lista stron kodowych znajduje się na stronie: Strony kodowe Można również określić jedną z wartości predefiniowanych wartości: CP_ACP, CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP, CP_UTF7, CP_UTF8.
      To co nas najbardziej interesuje:
      Przy ustawionej wartości CP_UTF8, argumenty lpDefaultCharlpUsedDefaultChar muszą mieć wartość 0 .
    • dwFlags
    • flagi wskazujące typ konwersji. Domyślnie MB_PRECOMPOSED = &H1.
      Dla strony kodowej 65000 (UTF-7) i 65001 (UTF-8) oraz niektórych egzotycznych stron kodowych japońskich, chńskich, indyjskich (strony kodowe:50220, 50221, 50222, 50225, 50227, 50229, 54936, 57002 do 57011, 42-symbol argument dwFlags musi być ustawiony na 0, lub na wartość MB_ERR_INVALID_CHARS.
      W zastosowaniach „Accessowych” można ustawić argument dwFlags = 0.
    • lpMultiByteStr
    • Wskaźnik (long pointer) do wejściowego ciągu do konwersji
    • cchMultiByte
    • Rozmiar w znakach, ciągu wskazanego przez lpMultiByteStr. Przypisanie do argumentu cchMultiByte wartości 0 jest nieprawidłowe i funkcja nie będzie działała poprawnie. Jeśli argument ten równy jest -1, funkcja przetwarza cały łańcuch wejściowy, w tym znak końca ciągu vbNullChar. Wynikowy ciąg znaków zawiera znak końca ciągu vbNullChar, a tym samym zwracana przez funkcję długość ciągu uwzględnia ten znak. Jeśli argument ten jest ustawiony na dodatnią liczbę całkowitą cchMultiByte > 0, funkcja przetwarza dokładnie określoną liczbę znaków. Jeśli w podanej ilości znaków nie zawiera się znak końca ciągu, wynikowy ciąg znaków nie jest zakończony znakiem końca ciągu vbNullChar. W zwracanej długość ciągu nie bedzie więc uwzględniony znak końca ciągu.
    • lpWideCharStr
    • Wskaźnik (long pointer) do buforu, do którego zostanie przekazany przekonwertowany wejściowy ciąg znaków.
    • cchWideChar
    • Rozmiar, w bajtach, bufora wskazanego przez lpWideCharStr. Jeśli argument ten jest ustawiony na 0, funkcja zwraca wymagany rozmiar bufora dla lpWideCharStr, ale nie zwraca przekonwertowanego ciągu w argumentcie lpWideCharStr.
  • zwraca:
  • Przy powodzeniu zwraca liczbę bajtów zapisanych w buforze wskazanym przez lpWideCharStr. Dla wartości argumentu cchWideChar = 0 i przy powodzeniu zwraca wymagany rozmiar buforu wskazanego przez lpWideCharStr, ale nie przekazuje przekonwertowanego ciągu do argumentu lpWideCharStr. Przy niepowodzeniu funkcja zwraca 0. Aby uzyskać rozszerzoną informację o zaistniałym błędzie, należy wywołać funkcję GetLastError.