2008-10-03 23 views
23

Jak ustawić stronę kodową na UTF-8 w programie C Windows?UTF-8 w systemie Windows

Mam bibliotekę innej firmy, która używa FOPEN do otwierania plików. Mogę użyć wcstombs do konwertowania moich nazw plików Unicode na bieżącą stronę kodową, jednak jeśli użytkownik ma nazwę pliku z postacią spoza strony kodowej, to się zepsuje.

Idealnie byłoby po prostu wywołać _setmbcp (65001), aby ustawić stronę kodową na UTF-8, jednak dokumentacja MSDN dla _setmbcp stwierdza, że ​​UTF-8 nie jest obsługiwany.

Jak mogę to obejść?

Odpowiedz

25

Niestety, nie ma sposobu, aby uczynić Unicode aktualną stroną kodową w systemie Windows. Stałe CP_UTF7 isą pseudo-stronami kodowymi, używanymi tylko w funkcjach konwersji MultiByteToWideChar i WideCharToMultiByte, jak wspomniał Ben.

Twój problem jest podobny do problemów z klasami C++. Konstruktorzy fstream akceptują tylko nazwy char*, uniemożliwiając otwarcie pliku o prawdziwej nazwie Unicode. Jedynym rozwiązaniem oferowanym przez VC był hack: otwórz plik oddzielnie, a następnie ustaw uchwyt dla obiektu strumienia. Obawiam się, że nie jest to opcja dla ciebie, ponieważ biblioteka osób trzecich prawdopodobnie nie przyjmuje uchwytów.

Jedyne rozwiązanie, jakie mogę sobie wyobrazić, to utworzenie tymczasowego pliku z nazwą inną niż Unicode, która jest nierozerwalnie związana z oryginałem i używa go jako parametru.

10

Wszystkie interfejsy API systemu Windows myślą w formacie UTF-16, więc lepiej pisać pismo dookoła swojej biblioteki, które konwertuje na granicach.

Dziwnie dosyć, Windows myśli UTF-8 jest strona kodowa dla celów konwersji, więc trzeba korzystać z tych samych funkcji API, jak w przypadku konwersji pomiędzy stron kodowych:

std::wstring Utf8ToUtf16(const char* u8string) 
{ 
    int wcharcount = strlen(u8string); 
    wchar_t *tempWstr = new wchar_t[wcharcount]; 
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount); 
    wstring w(tempWstr); 
    delete [] tempWstr; 
    return w; 
} 

i coś o podobnej formie do konwersji z powrotem .

-4

Użyj cygwin (który domyślnie udostępnia ustawienia regionalne UTF-8), lub napisz swój własny hack do libc dla Windows, który wykonuje niezbędne tłumaczenia UTF-8 na UTF-16 i owija niestandardowe funkcje _wfopen.

+2

naprawdę? zamierzasz to zasugerować? –

Powiązane problemy