Partager via


Fonction MultiByteToWideChar (stringapiset.h)

Mappe une chaîne de caractères à une chaîne UTF-16 (caractère large). La chaîne de caractères ne provient pas nécessairement d’un jeu de caractères multioctets.

Attention L’utilisation de la fonction MultiByteToWideChar peut compromettre la sécurité de votre application. L’appel de cette fonction peut facilement entraîner un dépassement de mémoire tampon, car la taille de la mémoire tampon d’entrée indiquée par lpMultiByteStr est égale au nombre d’octets dans la chaîne, tandis que la taille de la mémoire tampon de sortie indiquée par lpWideCharStr correspond au nombre de caractères. Pour éviter un dépassement de mémoire tampon, votre application doit spécifier une taille de mémoire tampon appropriée pour le type de données reçu par la mémoire tampon. Pour plus d’informations, consultez Considérations relatives à la sécurité : Fonctionnalités internationales.
 
Remarque Les pages de codes ANSI peuvent être différentes sur différents ordinateurs ou peuvent être modifiées pour un seul ordinateur, ce qui entraîne une altération des données. Pour les résultats les plus cohérents, les applications doivent utiliser Unicode, comme UTF-8 ou UTF-16, au lieu d’une page de codes spécifique, sauf si les normes ou les formats de données hérités empêchent l’utilisation d’Unicode. Si l’utilisation d’Unicode n’est pas possible, les applications doivent baliser le flux de données avec le nom d’encodage approprié lorsque les protocoles l’autorisent. Les fichiers HTML et XML autorisent l’étiquetage, mais les fichiers texte ne le font pas.
 

Syntaxe

int MultiByteToWideChar(
  [in]            UINT                              CodePage,
  [in]            DWORD                             dwFlags,
  [in]            _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
  [in]            int                               cbMultiByte,
  [out, optional] LPWSTR                            lpWideCharStr,
  [in]            int                               cchWideChar
);

Paramètres

[in] CodePage

Page de codes à utiliser pour effectuer la conversion. Ce paramètre peut être défini sur la valeur de n’importe quelle page de codes installée ou disponible dans le système d’exploitation. Pour obtenir la liste des pages de codes, consultez Identificateurs de page de codes. Votre application peut également spécifier l’une des valeurs indiquées dans le tableau suivant.

Valeur Signification
CP_ACP
Page de codes WINDOWS ANSI par défaut.
Remarque Cette valeur peut être différente sur différents ordinateurs, même sur le même réseau. Il peut être modifié sur le même ordinateur, ce qui entraîne l’endommagement irrécupérable des données stockées. Cette valeur est destinée uniquement à une utilisation temporaire et un stockage permanent doit utiliser UTF-16 ou UTF-8 si possible.
 
CP_MACCP
Page de codes Macintosh système actuelle.
Remarque Cette valeur peut être différente sur différents ordinateurs, même sur le même réseau. Il peut être modifié sur le même ordinateur, ce qui entraîne l’endommagement irrécupérable des données stockées. Cette valeur est destinée uniquement à une utilisation temporaire et un stockage permanent doit utiliser UTF-16 ou UTF-8 si possible.
 
Remarque Cette valeur est principalement utilisée dans le code hérité et ne doit généralement pas être nécessaire, car les ordinateurs Macintosh modernes utilisent Unicode pour l’encodage.
 
CP_OEMCP
Page de codes OEM du système actuel.
Remarque Cette valeur peut être différente sur différents ordinateurs, même sur le même réseau. Il peut être modifié sur le même ordinateur, ce qui entraîne l’endommagement irrécupérable des données stockées. Cette valeur est destinée uniquement à une utilisation temporaire et un stockage permanent doit utiliser UTF-16 ou UTF-8 si possible.
 
CP_SYMBOL
Page de codes de symbole (42).
CP_THREAD_ACP
Page de codes Windows ANSI pour le thread actif.
Remarque Cette valeur peut être différente sur différents ordinateurs, même sur le même réseau. Il peut être modifié sur le même ordinateur, ce qui entraîne l’endommagement irrécupérable des données stockées. Cette valeur est destinée uniquement à une utilisation temporaire et un stockage permanent doit utiliser UTF-16 ou UTF-8 si possible.
 
CP_UTF7
UTF-7. Utilisez cette valeur uniquement lorsqu’elle est forcée par un mécanisme de transport 7 bits. L’utilisation de UTF-8 est recommandée.
CP_UTF8
UTF-8.

[in] dwFlags

Indicateurs indiquant le type de conversion. L’application peut spécifier une combinaison des valeurs suivantes, avec MB_PRECOMPOSED étant la valeur par défaut. MB_PRECOMPOSED et MB_COMPOSITE s’excluent mutuellement. MB_USEGLYPHCHARS et MB_ERR_INVALID_CHARS peuvent être définis indépendamment de l’état des autres indicateurs.

Valeur Signification
MB_COMPOSITE Utilisez toujours des caractères décomposés, c’est-à-dire des caractères dans lesquels un caractère de base et un ou plusieurs caractères non interlignes ont chacun des valeurs de point de code distinctes. Par exemple, Ä est représenté par A + ̈ : LETTRE MAJUSCULE LATINE A (U+0041) + COMBINAISON DIAERÈSE (U+0308). Notez que cet indicateur ne peut pas être utilisé avec MB_PRECOMPOSED.
MB_ERR_INVALID_CHARS Échec si un caractère d’entrée non valide est rencontré.

À compter de Windows Vista, la fonction ne supprime pas les points de code non autorisés si l’application ne définit pas cet indicateur, mais remplace plutôt les séquences illégales par U+FFFD (encodées en fonction de la page de codes spécifiée).

Windows 2000 avec SP4 et versions ultérieures, Windows XP : Si cet indicateur n’est pas défini, la fonction supprime silencieusement les points de code illégal. Un appel à GetLastError retourne ERROR_NO_UNICODE_TRANSLATION.
MB_PRECOMPOSED
Faire défaut; ne pas utiliser avec MB_COMPOSITE. Utilisez toujours des caractères précomposés, c’est-à-dire des caractères ayant une valeur de caractère unique pour une combinaison de caractères de base ou de non-espacement. Par exemple, dans le caractère è, l’e est le caractère de base et la marque grave d’accentuation est le caractère non interligne. Si un point de code Unicode unique est défini pour un caractère, l’application doit l’utiliser au lieu d’un caractère de base distinct et d’un caractère non interligne. Par exemple, Ä est représenté par le point de code Unicode UNIQUE LETTRE MAJUSCULE LATINE A WITH DIAERESIS (U+00C4).
MB_USEGLYPHCHARS
Utilisez des caractères de glyphe au lieu des caractères de contrôle.

Pour les pages de codes répertoriées ci-dessous, dwFlags doit être définie sur 0. Sinon, la fonction échoue avec ERROR_INVALID_FLAGS.

  • 50220
  • 50221
  • 50222
  • 50225
  • 50227
  • 50229
  • 57002 à 57011
  • 65000 (UTF-7)
  • 42 (Symbole)

Note

 Pour UTF-8 ou la page de codes 54936 (GB18030, à partir de Windows Vista), dwFlags doivent être définis sur 0 ou MB_ERR_INVALID_CHARS. Sinon, la fonction échoue avec ERROR_INVALID_FLAGS.

[in] lpMultiByteStr

Pointeur vers la chaîne de caractères à convertir.

[in] cbMultiByte

Taille, en octets, de la chaîne indiquée par le paramètre lpMultiByteStr. Vous pouvez également définir ce paramètre sur -1 si la chaîne est terminée par null. Notez que, si cbMultiByte est 0, la fonction échoue.

Si ce paramètre est -1, la fonction traite la chaîne d’entrée entière, y compris le caractère null de fin. Par conséquent, la chaîne Unicode résultante a un caractère null de fin et la longueur retournée par la fonction inclut ce caractère.

Si ce paramètre est défini sur un entier positif, la fonction traite exactement le nombre spécifié d’octets. Si la taille fournie n’inclut pas de caractère null de fin, la chaîne Unicode résultante n’est pas terminée par null et la longueur retournée n’inclut pas ce caractère.

[out, optional] lpWideCharStr

Pointeur vers une mémoire tampon qui reçoit la chaîne convertie.

[in] cchWideChar

Taille, en caractères, de la mémoire tampon indiquée par lpWideCharStr. Si cette valeur est 0, la fonction retourne la taille de mémoire tampon requise, en caractères, y compris tout caractère null de fin et n’utilise pas la mémoire tampon lpWideCharStr.

Valeur de retour

Retourne le nombre de caractères écrits dans la mémoire tampon indiquée par lpWideCharStr en cas de réussite. Si la fonction réussit et que cchWideChar est 0, la valeur de retour est la taille requise, en caractères, pour la mémoire tampon indiquée par lpWideCharStr. Consultez également dwFlags pour plus d’informations sur la façon dont l’indicateur de MB_ERR_INVALID_CHARS affecte la valeur de retour lorsque les séquences non valides sont entrées.

La fonction retourne 0 si elle ne réussit pas. Pour obtenir des informations d’erreur étendues, l’application peut appeler GetLastError, qui peut retourner l’un des codes d’erreur suivants :

  • ERROR_INSUFFICIENT_BUFFER: une taille de mémoire tampon fournie n’était pas suffisamment grande, ou elle était incorrectement définie sur NULL.
  • ERROR_INVALID_FLAGS: les valeurs fournies pour les indicateurs n’étaient pas valides.
  • ERROR_INVALID_PARAMETER: toutes les valeurs de paramètre n’étaient pas valides.
  • ERROR_NO_UNICODE_TRANSLATION: Unicode non valide a été trouvé dans une chaîne.

Remarques

Le comportement par défaut de cette fonction consiste à se traduire en une forme précomposée de la chaîne de caractères d’entrée. Si un formulaire précomposé n’existe pas, la fonction tente de se traduire en formulaire composite.

L’utilisation de l’indicateur de MB_PRECOMPOSED a très peu d’effet sur la plupart des pages de codes, car la plupart des données d’entrée sont déjà composées. Envisagez d’appeler normalizeString après la conversion avec MultiByteToWideChar. NormalizeString fournit des données plus précises, standard et cohérentes, et peut également être plus rapide. Notez que pour l’énumération NORM_FORM passée à NormalizeString, NormalizationC correspond à MB_PRECOMPOSED et NormalizationD correspond à MB_COMPOSITE.

Comme mentionné dans la mise en garde ci-dessus, la mémoire tampon de sortie peut facilement être dépassée si cette fonction n’est pas d’abord appelée avec cchWideChar définie sur 0 afin d’obtenir la taille requise. Si l’indicateur MB_COMPOSITE est utilisé, la sortie peut être de trois caractères ou plus longs pour chaque caractère d’entrée.

Les pointeurs lpMultiByteStr et lpWideCharStr ne doivent pas être identiques. Si elles sont identiques, la fonction échoue et GetLastError retourne la valeur ERROR_INVALID_PARAMETER.

MultiByteToWideChar ne termine pas une chaîne de sortie si la longueur de la chaîne d’entrée est spécifiée explicitement sans caractère null de fin. Pour mettre fin à une chaîne de sortie pour cette fonction, l’application doit passer -1 ou compter explicitement le caractère null de fin de la chaîne d’entrée.

La fonction échoue si MB_ERR_INVALID_CHARS est définie et qu’un caractère non valide est rencontré dans la chaîne source. Un caractère non valide est l’un des éléments suivants :

  • Caractère qui n’est pas le caractère par défaut dans la chaîne source, mais se traduit par le caractère par défaut lorsque MB_ERR_INVALID_CHARS n’est pas défini.
  • Pour les chaînes DBCS, caractère qui a un octet de prospect, mais pas d’octet de fin valide.

À compter de Windows Vista, cette fonction est entièrement conforme à la spécification Unicode 4.1 pour UTF-8 et UTF-16. La fonction utilisée sur les systèmes d’exploitation précédents encode ou décode les paires de substitution moitiés ou paires de substitution incompatibles. Le code écrit dans les versions antérieures de Windows qui s’appuient sur ce comportement pour encoder des données binaires non textuelles aléatoires peut rencontrer des problèmes. Toutefois, le code qui utilise cette fonction sur des chaînes UTF-8 valides se comporte de la même façon que sur les systèmes d’exploitation Windows antérieurs.

Windows XP : Pour éviter le problème de sécurité des versions non abrégées des caractères UTF-8, MultiByteToWideChar supprime ces caractères.

à partir de Windows 8 :MultiByteToWideChar est déclaré dans Stringapiset.h. Avant Windows 8, il a été déclaré dans Winnls.h.

Exemple de code

catch (std::exception e)
{
    // Save in-memory logging buffer to a log file on error.

    ::std::wstring wideWhat;
    if (e.what() != nullptr)
    {
        int convertResult = MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), NULL, 0);
        if (convertResult <= 0)
        {
            wideWhat = L"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
            wideWhat += convertResult.ToString()->Data();
            wideWhat += L"  GetLastError()=";
            wideWhat += GetLastError().ToString()->Data();
        }
        else
        {
            wideWhat.resize(convertResult + 10);
            convertResult = MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), &wideWhat[0], (int)wideWhat.size());
            if (convertResult <= 0)
            {
                wideWhat = L"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
                wideWhat += convertResult.ToString()->Data();
                wideWhat += L"  GetLastError()=";
                wideWhat += GetLastError().ToString()->Data();
            }
            else
            {
                wideWhat.insert(0, L"Exception occurred: ");
            }
        }
    }
    else
    {
        wideWhat = L"Exception occurred: Unknown.";
    }

    Platform::String^ errorMessage = ref new Platform::String(wideWhat.c_str());
    // The session added the channel at level Warning. Log the message at
    // level Error which is above (more critical than) Warning, which
    // means it will actually get logged.
    _channel->LogMessage(errorMessage, LoggingLevel::Error);
    SaveLogInMemoryToFileAsync().then([=](StorageFile^ logFile) {
        _logFileGeneratedCount++;
        StatusChanged(this, ref new LoggingScenarioEventArgs(LoggingScenarioEventType::LogFileGenerated, logFile->Path->Data()));
    }).wait();
}

Exemple de exemples windows universels sur GitHub.

Exigences

Exigence Valeur
client minimum pris en charge Windows 2000 Professionnel [applications de bureau | Applications UWP]
serveur minimum pris en charge Windows 2000 Server [applications de bureau | Applications UWP]
plateforme cible Windows
d’en-tête stringapiset.h (include Windows.h)
bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

fonctions Unicode et jeu de caractères

des jeux de caractères et Unicode

WideCharToMultiByte

API Vertdll disponibles dans les enclaves VBS