Question

Comment définir la page de codes sur UTF-8 dans un programme Windows C?

J'ai une bibliothèque tierce qui utilise fopen pour ouvrir des fichiers. Je peux utiliser wcstombs pour convertir mes noms de fichiers Unicode vers la page de codes actuelle. Toutefois, si l'utilisateur a un nom de fichier avec un caractère situé en dehors de la page de codes, la procédure est interrompue.

Idéalement, je n’appellerais que _setmbcp (65001) pour définir la page de code sur UTF-8. Toutefois, la documentation MSDN relative à _setmbcp indique que UTF-8 n’est pas pris en charge.

Comment puis-je contourner cela?

Était-ce utile?

La solution

Malheureusement, il n’existe aucun moyen de définir Unicode comme page de code actuelle dans Windows. Les constantes CP_UTF7 et CP_UTF8 sont des pseudo-pages de code, utilisées uniquement dans MultiByteToWideChar et WideCharToMultiByte , comme Ben mentionné.

Votre problème est similaire à celui des classes C ++ fstream. Les constructeurs fstream acceptent uniquement les noms char * , rendant impossible l’ouverture d’un fichier portant un vrai nom Unicode. La seule solution proposée par VC était un hack: ouvrez le fichier séparément, puis définissez le handle sur l’objet stream. J'ai bien peur que ce ne soit pas une option pour vous, bien sûr, car la bibliothèque tierce n'accepte probablement pas les descripteurs.

La seule solution à laquelle je puisse penser est de créer un fichier temporaire avec un nom non-Unicode, lié à l'original, et de l'utiliser comme paramètre.

Autres conseils

Toutes les API Windows pensent en UTF-16, il est donc préférable d'écrire un emballage autour de votre bibliothèque qui convertit aux limites.

Assez curieusement, Windows pense que UTF-8 est une page de codes à des fins de conversion. Vous utilisez donc les mêmes API que pour convertir des pages de codes:

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;
}

Et quelque chose de forme similaire à reconvertir.

Mise à jour 2018: Windows 10 a activé le " 65001 " page de code moins & pseudo " en deux étapes:

  1. conhost change: le sous-système Windows pour Linux utilise la page de codes 65001 pour ses consoles. Il est également possible d’exécuter chcp 65001 dans cmd.exe depuis WSL. (Cela a provoqué quelques bugs Python assez stupides .)
  2. Paramètres régionaux complets: Windows depuis la version 17035, permet de définir UTF-8 comme page de codes de paramètres régionaux . Ceci est disponible à partir de la mise à jour d'avril 2018.

Utilisez cygwin (qui fournit par défaut des paramètres régionaux UTF-8) ou écrivez votre propre hacker libc pour Windows qui effectue les traductions nécessaires UTF-8 à UTF-16 et enveloppe le code _wfopen etc. non standard. . fonctions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top