Access

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



• API. Funkcje zarządzania tekstem.

Jak sprawdzić, czy tekst jest w formacie Unicode.

Czasami, przy wywoływaniu funkcji API zachodzi konieczność przekazania argumentu typu String w formacie Unicode. Aby ustrzec się przed nieprawidłowym działaniem funkcji operujących na ciągach znaków w formacie Unicode, powinniśmy przed przekazaniem go do  takiej funkcji, sprawdzić czy format tekstu jest zgodny z wymaganym formatem Unicode.
Windows API, w bibliotece "advapi32", zawiera funkcję IsTextUnicode służącą do testowania tekstu roboczego.

  Funkcja IsTextUnicode (...)

Windows API, w bibliotece "advapi32" zawiera funkcję IsTextUnicode(...), która służy do testowania, czy tekst roboczy jest w formacie Unicode.

 Opis funkcji API IsTextUnicode (...)

Sprawdzenie, czy tekst jest w formacie Unicode

Przykładowo. Poniższa deklaracja funkcji FindFirstFile Lib "kernel32" Alias "FindFirstFileW" oznacza, że funkcja pobiera i zwraca ciągi znaków w formacie Unicode. Określa to Alias z literą W na końcu, która pochodzi od pierwszej litery słowa ("Wide").

Private Declare Function FindFirstFile Lib "kernel32" _
	Alias "FindFirstFileW" _
	(ByVal lpFileName As String, _
	lpFindFileData As WIN32_FIND_DATA) As Long

Aby sprawdzić, czy przekazany argument lpFileName (pełna ścieżka do pliku lub folderu) jest w formacie Unicode możemy użyć funkcji IsTextUnicode(...)

 Public Declare Function IsTextUnicode Lib "advapi32" _
	Alias "IsTextUnicode" _
	(ByVal lpBuffer As String, _
	ByVal iSize As Long, _
	lpiResult As Long) As Long
  • argumenty:
    • lpBuffer
    • Ciąg znaków, który ma być testowany
    • iSize
    • Długość w bajtach testowanego ciągu znaków
    • lpiResult
    • Na wyjściu [Out] określa wartość składowych flagi, dla której zawartość bufora przeszła test (zazwyczaj tylko flagi ustawione na wejściu, mogą być zwrócone na wyjściu).
      Na wejściu [In] określa metody, (flagę) określająca w jaki sposób ma być testowany wejściowy ciąg znaków lpBuffer. Przy niepowodzeniu testu (tekst w buforze nie jest w formacie Unicode) zwracane jest Zero.
      Argument ten może przyjmować jedną z poniższych wartości, lub być kombinacją poniższych wartości przy użyciu binarnego operatora OR
      Const IS_TEXT_UNICODE_ASCII16 = &H1
      tekst jest typu Unicode i zawiera wyłącznie zastaw znaków "zero-extended" ASCII,
      Const IS_TEXT_UNICODE_REVERSE_ASCII16 = &H10
      jak wyżej, ale tekst Unicode posiada odwróconą kolejnością bajtów,
      Const IS_TEXT_UNICODE_STATISTICS = &H2
      ustalenie, czy tekst jest Unicode dokonywane jest przy zastosowaniu analizy statystycznej, metoda ta nie daje stuprocentowej pewności,
      Const IS_TEXT_UNICODE_REVERSE_STATISTICS = &H20
      jak w wyżej, ale tekst Unicode posiada odwróconą kolejnością bajtów,
      Const IS_TEXT_UNICODE_CONTROLS = &H4
      tekst Unicode zawiera niedrukowalne znaki np.: RETURN, LINEFEED, SPACE, CJK_SPACE, TAB,
      Const IS_TEXT_UNICODE_REVERSE_CONTROLS = &H40
      jak wyżej, ale tekst Unicode posiada odwróconą kolejnością bajtów,
      Const IS_TEXT_UNICODE_BUFFER_TOO_SMALL ="&H??"
      w buforze istnieje zbyt mało znaków by dokonać wiarygodnej analizy tekstu (mniej niż dwa bajty),
      Const IS_TEXT_UNICODE_SIGNATURE = &H8
      na początku tekstu znajduje się Unicodowy znacznik kolejności bajtów (BOM) 0xFEFF,
      Const IS_TEXT_UNICODE_REVERSE_SIGNATURE = &H80
      na początku tekstu znajduje się Unicodowy odwrócony znacznik kolejności bajtów (Reverse BOM) 0xFFFE,
      Const IS_TEXT_UNICODE_ILLEGAL_CHARS = &H100
      tekst zawiera jeden z niedozwolonych znaków Unicode: odwrócony znacznik kolejności bajtów (Reverse BOM) 0xFFFE, UNICODE_NUL, CRLF (zapisane jako jedno słowo), lub wartości 0xFFFF,
      Const IS_TEXT_UNICODE_ODD_LENGTH = &H200
      liczba znaków w ciągu jest nieparzysta, więc z definicji tekst nie jest tekstem Unicode,
      Const IS_TEXT_UNICODE_NULL_BYTES = &H1000
      tekst zawiera znak vbNullChar (Chr(0)), co znaczy że tekst nie jest w wersji ASCII,
      Const IS_TEXT_UNICODE_UNICODE_MASK = &HF
      flaga ta jest kombinacją:
      IS_TEXT_UNICODE_ASCII16 Or _
      IS_TEXT_UNICODE_STATISTICS Or _
      IS_TEXT_UNICODE_CONTROLS Or _
      IS_TEXT_UNICODE_SIGNATURE
      Const IS_TEXT_UNICODE_REVERSE_MASK = &HF0
      flaga ta jest kombinacją:
      IS_TEXT_UNICODE_REVERSE_ASCII16 Or _
      IS_TEXT_UNICODE_REVERSE_STATISTICS Or _
      IS_TEXT_UNICODE_REVERSE_CONTROLS Or _
      IS_TEXT_UNICODE_REVERSE_SIGNATURE
      Const IS_TEXT_UNICODE_NOT_UNICODE_MASK = &HF00
      flaga ta jest kombinacją:
      IS_TEXT_UNICODE_ILLEGAL_CHARS Or _
      IS_TEXT_UNICODE_ODD_LENGTH Or _
      dwa aktualnie nieużywane bity,
      Const IS_TEXT_UNICODE_NOT_ASCII_MASK = &HF000
      flaga ta jest kombinacją:
      IS_TEXT_UNICODE_NULL_BYTES Or _
      trzy aktualnie nieużywane bity
      Const IS_TEXT_UNICODE_DBCS_LEADBYTE = &H400
      tekst jest kodowany jako DBSC z bajtem prowadzącym kodowania dwubajtowego,
  • zwraca:
  • Funkcja IsTextUnicode(...) sprawdza, czy bufor wejściowy lpBuffer zawiera tekst w formacie Unicode, zwraca Zero, jeżeli tekst w buforze nie przeszedł testu metodą przekazaną przez wskaźnik lpiResult. Jeżli tekst jest zgodny z metodą testu, funkcja zwraca wartość różną od Zera, a wynik testu zwracany jest za pośrednictwem wskaźnika lpiResult.