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żeli tekst jest zgodny z metodą testu, funkcja zwraca wartość różną od Zera, a wynik testu zwracany jest za pośrednictwem wskaźnika lpiResult.