2012-01-12 13 views
18

Czy można używać funkcji API Windows API ANSI z ciągami UTF-8?Funkcje interfejsu Windows API ANSI i UTF-8

Załóżmy na przykład, że mam ścieżkę zakodowaną w UTF-8. Czy mogę zadzwonić pod numer CreateDirectoryA lub CreateFileA i użyć ścieżki UTF-8, czy też muszę wykonać jakąś konwersję przed wywołaniem funkcji?

+2

Yikes. Dlaczego ktoś by chciał? Myślę, że jesteśmy już daleko za Windows ME (który był ostatnią wersją Windowsa, która kiedykolwiek potrzebowała interfejsów ANSI API). Powinni już wymrzeć, zwłaszcza w przypadku nowo opracowanych aplikacji. – Joey

+1

Skąd czerpiesz sygnały UTF-8? O wiele łatwiej jest przekonwertować aplikację do pracy z ciągami UTF-16, ponieważ wymagają tego tak zwane funkcje API Windows o szerokich wersjach. I jak mówi Joey, * zawsze * wywołaj szerokie wersje (z sufiksem "W"), a nie wersje ANSI. Te są przestarzałe od dziesięcioleci. –

+4

@Joey: Ponieważ strasznie dużo bibliotek C (++) (łącznie z biblioteką standardową!) Wolimy pracować z łańcuchami 'char' niż łańcuchami' wchar_t'. Jeśli system Windows w pełni obsługuje kodowanie UTF-8, możesz po prostu użyć UTF-8 w całym programie, zamiast ciągle konwertować UTF-8 i UTF-16. – dan04

Odpowiedz

15

Nr Użyj MultiByteToWideChar do konwersji UTF-8 na UTF-16, a następnie wywołaj API szerokich znaków, takie jak CreateDirectoryW lub CreateFileW.

+0

Cholera, bałem się tego .. :(Gah .. Lepiej zacznij od tego wtedy .. – krebstar

+12

Dodam też, że skoro Windows używa wyłącznie UTF-16, najlepiej będzie, jeśli podążysz za nim i będziesz pracować z UTF -16 w przeważającej części, a konwersję do UTF-8 wykonuje się tylko wtedy, gdy trzeba czytać/zapisywać ze źródeł zewnętrznych: – casablanca

+4

@casablanca: Innym podejściem, które zaleca się, jest używanie w większości UTF-8 i konwersja do i z UTF-16 tylko podczas rozmowy z interfejsem Windows. –

3

Łatwiejszym podejściem (niż używanie surowego API Win32 MultiByteToWideChar) byłoby użycie ATL conversion helpers, np. CA2CW. Można określić CP_UTF8 jako strona kodowa (drugi parametr w konstruktorze), przekonwertować z Unicode UTF-8 Unicode UTF-16:

CreateDirectoryW( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 

pamiętać, że w Unicode buduje (które powinny być te domyślne te dzień), createDirectory tylko rozszerza się CreateDirectoryW, więc chciałbym tylko kropla końcówka "w" i użyj (IMHO bardziej czytelny) createDirectory:

CreateDirectory( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 
Powiązane problemy