Funzione MultiByteToWideChar (stringapiset.h)

Esegue il mapping di una stringa di caratteri a una stringa UTF-16 (carattere wide). La stringa di caratteri non è necessariamente da un set di caratteri multibyte.

Attenzione L'uso della funzione MultiByteToWideChar in modo errato può compromettere la sicurezza dell'applicazione. La chiamata di questa funzione può causare facilmente un overrun del buffer perché le dimensioni del buffer di input indicate da lpMultiByteStr corrispondono al numero di byte nella stringa, mentre la dimensione del buffer di output indicato da lpWideCharStr equivale al numero di caratteri. Per evitare l'overrun del buffer, l'applicazione deve specificare una dimensione del buffer appropriata per il tipo di dati ricevuto dal buffer. Per altre informazioni, vedere Considerazioni sulla sicurezza: Funzionalità internazionali.
 
Nota Le pagine codici ANSI possono essere diverse in computer diversi o possono essere modificate per un singolo computer, causando il danneggiamento dei dati. Per i risultati più coerenti, le applicazioni devono usare Unicode, ad esempio UTF-8 o UTF-16, anziché una tabella codici specifica, a meno che gli standard legacy o i formati di dati non impediscono l'uso di Unicode. Se l'uso di Unicode non è possibile, le applicazioni devono contrassegnarlo con il nome di codifica appropriato quando i protocolli lo consentono. I file HTML e XML consentono l'assegnazione di tag, ma non i file di testo.
 

Sintassi

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

Parametri

[in] CodePage

Pagina codici da usare per eseguire la conversione. Questo parametro può essere impostato sul valore di qualsiasi tabella codici installata o disponibile nel sistema operativo. Per un elenco di pagine codici, vedere Identificatori di tabella codici. L'applicazione può anche specificare uno dei valori illustrati nella tabella seguente.

Valore Significato
CP_ACP
Tabella codici windows ANSI predefinita del sistema.
Nota Questo valore può essere diverso in computer diversi, anche nella stessa rete. Può essere modificato nello stesso computer, portando a archiviare i dati che diventano irreversibilmente danneggiati. Questo valore è destinato solo all'uso temporaneo e all'archiviazione permanente deve usare UTF-16 o UTF-8, se possibile.
 
CP_MACCP
Tabella codici Macintosh di sistema corrente.
Nota Questo valore può essere diverso in computer diversi, anche nella stessa rete. Può essere modificato nello stesso computer, portando a archiviare i dati che diventano irreversibilmente danneggiati. Questo valore è destinato solo all'uso temporaneo e all'archiviazione permanente deve usare UTF-16 o UTF-8, se possibile.
 
Nota Questo valore viene usato principalmente nel codice legacy e non deve essere generalmente necessario poiché i computer Macintosh moderni usano Unicode per la codifica.
 
CP_OEMCP
Tabella codici OEM del sistema corrente.
Nota Questo valore può essere diverso in computer diversi, anche nella stessa rete. Può essere modificato nello stesso computer, portando a archiviare i dati che diventano irreversibilmente danneggiati. Questo valore è destinato solo all'uso temporaneo e all'archiviazione permanente deve usare UTF-16 o UTF-8, se possibile.
 
CP_SYMBOL
Tabella codici simbolo (42).
CP_THREAD_ACP
Tabella codici ANSI di Windows per il thread corrente.
Nota Questo valore può essere diverso in computer diversi, anche nella stessa rete. Può essere modificato nello stesso computer, portando a archiviare i dati che diventano irreversibilmente danneggiati. Questo valore è destinato solo all'uso temporaneo e all'archiviazione permanente deve usare UTF-16 o UTF-8, se possibile.
 
CP_UTF7
UTF-7. Usare questo valore solo quando viene forzato da un meccanismo di trasporto a 7 bit. L'uso di UTF-8 è preferito.
CP_UTF8
UTF-8.

[in] dwFlags

Flag che indicano il tipo di conversione. L'applicazione può specificare una combinazione dei valori seguenti, con MB_PRECOMPOSED come impostazione predefinita. MB_PRECOMPOSED e MB_COMPOSITE si escludono a vicenda. MB_USEGLYPHCHARS e MB_ERR_INVALID_CHARS possono essere impostati indipendentemente dallo stato degli altri flag.

Valore Significato
MB_COMPOSITE Usare sempre i caratteri decomposti, ovvero i caratteri in cui un carattere di base e uno o più caratteri nonpacing hanno valori di punto di codice distinti. Ad esempio, Ä è rappresentato da A + ̈: LETTERA MAIUSCOLA LATINA A (U+0041) + COMBINAZIONE DIAERESIS (U+0308). Si noti che questo flag non può essere usato con MB_PRECOMPOSED.
MB_ERR_INVALID_CHARS Errore se viene rilevato un carattere di input non valido.

A partire da Windows Vista, la funzione non elimina i punti di codice illegali se l'applicazione non imposta questo flag, ma sostituisce le sequenze illegali con U+FFFD (codificato come appropriato per la pagina codici specificata).

Windows 2000 con SP4 e versioni successive, Windows XP: Se questo flag non è impostato, la funzione elimina in modo automatico i punti di codice non validi. Una chiamata a GetLastError restituisce ERROR_NO_UNICODE_TRANSLATION.
MB_PRECOMPOSED
Predefinito; non usare con MB_COMPOSITE. Usare sempre caratteri precomposti, ovvero caratteri con un singolo valore di carattere per una combinazione di caratteri di base o nonpacing. Ad esempio, nel carattere è, l'e è il carattere di base e il contrassegno grave accentato è il carattere nonpacing. Se per un carattere viene definito un singolo punto di codice Unicode, l'applicazione deve usarla anziché un carattere di base separato e un carattere nonpacing. Ad esempio, Ä è rappresentato dal singolo punto di codice Unicode LETTERA MAIUSCOLA LATINA A WITH DIAERESIS (U+00C4).
MB_USEGLYPHCHARS
Usare i caratteri glifi anziché i caratteri di controllo.

Per le pagine codici elencate di seguito, è necessario impostare dwFlags su 0. In caso contrario, la funzione ha esito negativo con ERROR_INVALID_FLAGS.

  • 50220
  • 50221
  • 50222
  • 50225
  • 50227
  • 50229
  • Da 57002 a 57011
  • 65000 (UTF-7)
  • 42 (simbolo)

Nota

 Per UTF-8 o tabella codici 54936 (GB18030, a partire da Windows Vista), è necessario impostare dwFlags su 0 o MB_ERR_INVALID_CHARS. In caso contrario, la funzione ha esito negativo con ERROR_INVALID_FLAGS.

[in] lpMultiByteStr

Puntatore alla stringa di caratteri da convertire.

[in] cbMultiByte

Dimensioni, in byte, della stringa indicata dal parametro lpMultiByteStr . In alternativa, questo parametro può essere impostato su -1 se la stringa è terminata con null. Si noti che, se cbMultiByte è 0, la funzione ha esito negativo.

Se questo parametro è -1, la funzione elabora l'intera stringa di input, incluso il carattere null terminante. Pertanto, la stringa Unicode risultante ha un carattere null terminante e la lunghezza restituita dalla funzione include questo carattere.

Se questo parametro è impostato su un intero positivo, la funzione elabora esattamente il numero specificato di byte. Se le dimensioni specificate non includono un carattere Null terminante, la stringa Unicode risultante non viene terminata con valore Null e la lunghezza restituita non include questo carattere.

[out, optional] lpWideCharStr

Puntatore a un buffer che riceve la stringa convertita.

[in] cchWideChar

Dimensioni, in caratteri, del buffer indicato da lpWideCharStr. Se questo valore è 0, la funzione restituisce le dimensioni del buffer necessarie, in caratteri, inclusi tutti i caratteri null terminanti e non usa il buffer lpWideCharStr .

Valore restituito

Restituisce il numero di caratteri scritti nel buffer indicato da lpWideCharStr se ha esito positivo. Se la funzione ha esito positivo e cchWideChar è , il valore restituito è 0la dimensione necessaria, in caratteri, per il buffer indicato da lpWideCharStr. Vedere anche dwFlags per informazioni sul modo in cui il flag MB_ERR_INVALID_CHARS influisce sul valore restituito quando le sequenze non valide sono di input.

La funzione restituisce 0 se non riesce. Per ottenere informazioni sull'errore estese, l'applicazione può chiamare GetLastError, che può restituire uno dei codici di errore seguenti:

  • ERROR_INSUFFICIENT_BUFFER: una dimensione del buffer fornita non è sufficiente oppure è stata impostata in modo errato su NULL.
  • ERROR_INVALID_FLAGS: i valori forniti per i flag non sono validi.
  • ERROR_INVALID_PARAMETER: i valori dei parametri non sono validi.
  • ERROR_NO_UNICODE_TRANSLATION: è stato trovato Unicode non valido in una stringa.

Commenti

Il comportamento predefinito di questa funzione consiste nel tradurre in una forma precomposta della stringa di caratteri di input. Se non esiste un modulo precomposto, la funzione tenta di tradurre in una forma composita.

L'uso del flag di MB_PRECOMPOSED ha molto poco effetto sulla maggior parte delle pagine codici perché la maggior parte dei dati di input è già composta. Prendere in considerazione la chiamata di NormalString dopo la conversione con MultiByteToWideChar. NormalString offre dati più accurati, standard e coerenti e possono anche essere più veloci. Si noti che per l'enumerazione NORM_FORM passata a NormalString, NormalizationC corrisponde a MB_PRECOMPOSED e NormalizationD corrisponde a MB_COMPOSITE.

Come accennato in precedenza, il buffer di output può essere facilmente superato se questa funzione non viene prima chiamata con cchWideChar impostata su 0 per ottenere le dimensioni necessarie. Se viene usato il flag MB_COMPOSITE, l'output può essere di tre o più caratteri per ogni carattere di input.

I puntatori lpMultiByteStr e lpWideCharStr non devono essere uguali. Se sono uguali, la funzione ha esito negativo e GetLastError restituisce il valore ERROR_INVALID_PARAMETER.

MultiByteToWideChar non termina una stringa di output se la lunghezza della stringa di input viene specificata in modo esplicito senza un carattere Null terminante. Per terminare una stringa di output per questa funzione, l'applicazione deve passare in modo esplicito -1 o contare in modo esplicito il carattere null terminante per la stringa di input.

La funzione ha esito negativo se MB_ERR_INVALID_CHARS è impostato e viene rilevato un carattere non valido nella stringa di origine. Un carattere non valido è uno dei seguenti:

  • Carattere che non è il carattere predefinito nella stringa di origine, ma si traduce nel carattere predefinito quando MB_ERR_INVALID_CHARS non è impostato.
  • Per le stringhe DBCS, un carattere con un byte di lead ma nessun byte finale valido.

A partire da Windows Vista, questa funzione è completamente conforme alla specifica Unicode 4.1 per UTF-8 e UTF-16. La funzione usata nei sistemi operativi precedenti codifica o decodifica le metà surrogate solitarie o coppie surrogate non corrispondenti. Il codice scritto nelle versioni precedenti di Windows che si basano su questo comportamento per codificare dati binari non testuali casuali potrebbe verificarsi problemi. Tuttavia, il codice che usa questa funzione in stringhe UTF-8 valide si comporta come nei sistemi operativi Windows precedenti.

Windows XP: Per evitare il problema di sicurezza delle versioni non più brevi dei caratteri UTF-8, MultiByteToWideChar elimina questi caratteri.

A partire da Windows 8:MultiByteToWideChar è dichiarato in Stringapiset.h. Prima di Windows 8, è stato dichiarato in Winnls.h.

Esempio di codice

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

Esempio di Esempi universali di Windows in GitHub.

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [app desktop | App UWP]
Server minimo supportato Windows 2000 Server [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione stringapiset.h (includere Windows.h)
Libreria Kernel32.lib
DLL Kernel32.dll

Vedere anche

Funzioni unicode e set di caratteri

Set di caratteri e Unicode

WideCharToMultiByte

API Vertdll disponibili nelle enclave VBS