En un mot: la WideCharToMultiByte fonction expose les codages/pages de code utilisé pour la conversion dans la liste des paramètres, alors que wcstombs ne le fait pas. C'est l'un des principaux PITA, comme le standard ne pas définir quel encodage est utilisé pour produire de l' wchar_t, tandis que vous, en tant que développeur certainement besoin de savoir ce que le codage de la conversion.
En dehors de cela, WideCharToMultiByte est bien sûr une fonction API Windows et n'est pas disponible sur toute autre plate-forme.
Par conséquent, je suggère d'utiliser WideCharToMultiByte, sans hésiter, si votre application n'est pas spécifiquement écrit pour être portable à la non-Windows Os. Sinon, vous pouvez lutter avec wcstombs ou (de préférence à mon humble avis) de regarder dans l'aide d'une pleine fonctionnalité portable Unicode bibliothèque comme Soins intensifs.
"la norme ne définit pas quel encodage est utilisé pour produire de l'wchar_t, tout en vous en tant que développeur certainement besoin de savoir ce que le codage de la conversion vers/à partir de". Cela dépend de ce que vous êtes après. WideCharToMultiByte se convertit en UTF-16 pour Win32 code de la page de votre choix. wcstombs convertit de mise en œuvre définies par l'interne wchar_t représentation actuels définis par l'implémentation interne multi-octets de la représentation. Il n'est pas nécessaire que les développeurs doivent savoir définis par l'implémentation d'encodages. Si vous êtes juste de passage des chaînes entre les fonctions de la bibliothèque C alors non, il n'est pas nécessaire de connaître les codages utilisés. Dans la pratique, toutefois, vous le faites à interagir avec les entités externes (par exemple, dans le cas le plus simple de lecture/écriture sur un cours d'eau). Et l'entité externe certainement t soins de l'encodage que vous lui donnez. "Dans la pratique, toutefois, vous le faites à interagir avec les entités externes" Ou pour convertir des chaînes entre wchar_t base et char à base de fonctions d'entrée/sortie. "entité externe n'est certainement de soins de l'encodage que vous nourrir" le Vrai. Mais parfois externes de l'entité s'attend par exemple multi-octets chaîne représentée dans la mise en œuvre définies de manière standard (qui peut même arriver à être configurable par l'utilisateur). Je vous prie d'être en désaccord. Comment est-il possible pour l'entité externe à attendre une chaîne de caractères encodée dans une "mise en œuvre défini", alors que personne (y compris l'entité) sait quoi "mise en œuvre" signifie? <<personne (y compris l'entité) sait quoi "mise en œuvre" signifie>> Ce n'est pas vrai. Terme "mise en œuvre" n'est pas la même chose que "undefined". "Mise en œuvre" signifie clairement définis et documentés par la mise en œuvre.
WideCharToMultiByte est une fonction API Windows qui convertit entre les Fenêtres définis multi-octets code des pages stockées dans le CHAR, et UTF16, stockées dans WCHAR. La page de codes à utiliser est passé comme premier paramètre, et peut être passé comme CP_ACP, ce qui signifie une page de codes spécifiques aux systèmes actuels de paramètres régionaux dans le panneau de contrôle de l'outil de Localisation "de la Langue à utiliser pour les Programmes Non Unicode". Il est accessible par #, y compris, et est disponible uniquement sur Windows.
wcstombs est une Norme d'Exécution C, fonction qui convertit entre le c-temps de fonctionnement actuel char* l'encodage, et wchar_t* l'encodage. setlocale iirc peut être utilisée pour définir la page de code(s) à utiliser.
std::codecvt est la Norme C++ de la Bibliothèque de classe de modèle, dans , utilisé pour la conversion de chaînes de caractères entre les différents codages en utilisant une variété de traits de type des mécanismes pour définir la source et la destination d'encodages.
Il y a d'autres bibliothèques, notamment ICONV ou de soins intensifs à faire, et divers unicode <-> conversions multi-octets.
grand matériau de référence. la question avait déjà une réponse sélectionnée, j'ai juste pensé que quelqu'un devrait peut-être mentionner (étant Donné que la question a été marqué c++, c) que le c++ a une solution.
Comme avec toute autre fonction: utiliser la fonction qui fait ce que vous avez besoin dans votre programme.
WideCharToMultiByte se convertit en UTF-16 (utilisé comme Win32 WCHAR représentation) pour Win32 code de la page de votre choix.
wcstombs convertit de mise en œuvre définies par l'interne wchar_t représentation actuels définis par l'implémentation interne multi-octets de la représentation.
Donc, si votre programme est natif Win32 programme qui utilise beaucoup de fonctions de l'API WIN32 qui utilisent et retour WCHAR chaînes ensuite, vous devez WideCharToMultiByte. Si vous écrire quelques fonctions de la bibliothèque standard (pas de Win32 API) qui travaillent à la norme C wchar_t chaînes ensuite, vous devez wcstombs.
La principale différence est que wcstombs est une fonction standard, afin de l'utiliser que si le code doit s'exécuter sur des plateformes autres que Windows.
wcstombs() est portable, alors que la WideCharToMultiByte() fonction est win32.
Quand il descend à lui, wcstombs() appelle un système de fonction spécifique, qui sur Win32 sera probablement un droit d'appel à WideCharToMultiByte() - toutefois, il pourrait contourner cette fonction complètement et juste aller directement à l'intérieur.
En un mot: la
WideCharToMultiByte
fonction expose les codages/pages de code utilisé pour la conversion dans la liste des paramètres, alors quewcstombs
ne le fait pas. C'est l'un des principaux PITA, comme le standard ne pas définir quel encodage est utilisé pour produire de l'wchar_t
, tandis que vous, en tant que développeur certainement besoin de savoir ce que le codage de la conversion.En dehors de cela,
WideCharToMultiByte
est bien sûr une fonction API Windows et n'est pas disponible sur toute autre plate-forme.Par conséquent, je suggère d'utiliser
WideCharToMultiByte
, sans hésiter, si votre application n'est pas spécifiquement écrit pour être portable à la non-Windows Os. Sinon, vous pouvez lutter avecwcstombs
ou (de préférence à mon humble avis) de regarder dans l'aide d'une pleine fonctionnalité portable Unicode bibliothèque comme Soins intensifs.WideCharToMultiByte
se convertit en UTF-16 pour Win32 code de la page de votre choix.wcstombs
convertit de mise en œuvre définies par l'internewchar_t
représentation actuels définis par l'implémentation interne multi-octets de la représentation. Il n'est pas nécessaire que les développeurs doivent savoir définis par l'implémentation d'encodages.Si vous êtes juste de passage des chaînes entre les fonctions de la bibliothèque C alors non, il n'est pas nécessaire de connaître les codages utilisés. Dans la pratique, toutefois, vous le faites à interagir avec les entités externes (par exemple, dans le cas le plus simple de lecture/écriture sur un cours d'eau). Et l'entité externe certainement t soins de l'encodage que vous lui donnez.
"Dans la pratique, toutefois, vous le faites à interagir avec les entités externes" Ou pour convertir des chaînes entre wchar_t base et char à base de fonctions d'entrée/sortie. "entité externe n'est certainement de soins de l'encodage que vous nourrir" le Vrai. Mais parfois externes de l'entité s'attend par exemple multi-octets chaîne représentée dans la mise en œuvre définies de manière standard (qui peut même arriver à être configurable par l'utilisateur).
Je vous prie d'être en désaccord. Comment est-il possible pour l'entité externe à attendre une chaîne de caractères encodée dans une "mise en œuvre défini", alors que personne (y compris l'entité) sait quoi "mise en œuvre" signifie?
<<personne (y compris l'entité) sait quoi "mise en œuvre" signifie>> Ce n'est pas vrai. Terme "mise en œuvre" n'est pas la même chose que "undefined". "Mise en œuvre" signifie clairement définis et documentés par la mise en œuvre.
OriginalL'auteur Jon
WideCharToMultiByte est une fonction API Windows qui convertit entre les Fenêtres définis multi-octets code des pages stockées dans le CHAR, et UTF16, stockées dans WCHAR. La page de codes à utiliser est passé comme premier paramètre, et peut être passé comme CP_ACP, ce qui signifie une page de codes spécifiques aux systèmes actuels de paramètres régionaux dans le panneau de contrôle de l'outil de Localisation "de la Langue à utiliser pour les Programmes Non Unicode". Il est accessible par #, y compris, et est disponible uniquement sur Windows.
wcstombs est une Norme d'Exécution C, fonction qui convertit entre le c-temps de fonctionnement actuel char* l'encodage, et wchar_t* l'encodage. setlocale iirc peut être utilisée pour définir la page de code(s) à utiliser.
std::codecvt est la Norme C++ de la Bibliothèque de classe de modèle, dans , utilisé pour la conversion de chaînes de caractères entre les différents codages en utilisant une variété de traits de type des mécanismes pour définir la source et la destination d'encodages.
Il y a d'autres bibliothèques, notamment ICONV ou de soins intensifs à faire, et divers unicode <-> conversions multi-octets.
la question avait déjà une réponse sélectionnée, j'ai juste pensé que quelqu'un devrait peut-être mentionner (étant Donné que la question a été marqué c++, c) que le c++ a une solution.
OriginalL'auteur Chris Becke
Comme avec toute autre fonction: utiliser la fonction qui fait ce que vous avez besoin dans votre programme.
WideCharToMultiByte
se convertit en UTF-16 (utilisé comme Win32 WCHAR représentation) pour Win32 code de la page de votre choix.wcstombs
convertit de mise en œuvre définies par l'internewchar_t
représentation actuels définis par l'implémentation interne multi-octets de la représentation.Donc, si votre programme est natif Win32 programme qui utilise beaucoup de fonctions de l'API WIN32 qui utilisent et retour WCHAR chaînes ensuite, vous devez
WideCharToMultiByte
. Si vous écrire quelques fonctions de la bibliothèque standard (pas de Win32 API) qui travaillent à la norme C wchar_t chaînes ensuite, vous devezwcstombs
.OriginalL'auteur Serge Dundich
La principale différence est que
wcstombs
est une fonction standard, afin de l'utiliser que si le code doit s'exécuter sur des plateformes autres que Windows.OriginalL'auteur Fred Foo
wcstombs()
est portable, alors que laWideCharToMultiByte()
fonction est win32.Quand il descend à lui,
wcstombs()
appelle un système de fonction spécifique, qui sur Win32 sera probablement un droit d'appel àWideCharToMultiByte()
- toutefois, il pourrait contourner cette fonction complètement et juste aller directement à l'intérieur.En tout cas, il n'y a pas de différence pratique.
OriginalL'auteur Ben Stott