WideCharToMultiByte () vs. wcstombs ()

Qual è la differenza tra WideCharToMultiByte () e wcstombs () Quando utilizzare quale?

In poche parole: la funzione WideCharToMultiByte espone le codifiche / le code page utilizzate per la conversione nell’elenco dei parametri, mentre wcstombs no. Questo è un importante PITA, in quanto lo standard non definisce quale codifica deve essere utilizzata per produrre wchar_t , mentre tu come sviluppatore devi certamente sapere quale codifica stai convertendo in / da.

Oltre a ciò, WideCharToMultiByte è ovviamente una funzione API di Windows e non è disponibile su nessuna altra piattaforma.

Pertanto suggerirei di utilizzare WideCharToMultiByte senza un attimo di riflessione se la tua applicazione non è stata specificamente scritta per essere portabile a sistemi operativi non Windows. Altrimenti, potresti voler lottare con wcstombs o (preferibilmente IMHO) per usare una libreria Unicode portatile con funzionalità complete come ICU .

  • WideCharToMultiByte è una funzione API di Windows che converte le pagine di codice multibyte definite da Windows memorizzate in CHAR e UTF16, memorizzate in WCHAR. La codepage da utilizzare viene passata come primo parametro e può essere passata come CP_ACP, ovvero una codepage specifica per le impostazioni internazionali correnti del sistema, impostate nel pannello di controllo Strumento di localizzazione “Lingua da utilizzare per programmi non Unicode”. Vi si accede da #include, ed è disponibile solo su Windows.

  • wcstombs è una funzione di runtime C standard che converte tra la codifica di char * di c-runtime e la codifica di wchar_t *. setlocale iirc può essere utilizzato per impostare la codepage (s) da utilizzare.

  • std :: codecvt è la class template della libreria standard C ++, in, usata per convertire stringhe tra varie codifiche usando una varietà di caratteri tipo mechanisims per definire le codifiche sorgente e destinazione.

Esistono altre librerie, tra cui ICONV o ICU che eseguono anche varie conversioni <-> multibyte unicode.

Come con qualsiasi altra funzione: usa la funzione che fa ciò che ti serve nel tuo programma.

WideCharToMultiByte converte da UTF-16 (utilizzato come rappresentazione WCHAR Win32) in una pagina di codice Win32 a tua scelta.

wcstombs converte dalla rappresentazione interna wchar_t definita dall’implementazione alla rappresentazione multi-byte interna definita dall’implementazione corrente.

Quindi se il tuo programma è un programma nativo Win32 che utilizza molte funzioni API WIN32 che utilizzano e restituiscono stringhe WCHAR, allora hai bisogno di WideCharToMultiByte . Se si scrivono alcune funzioni basate su una libreria standard (non API Win32) che funziona con stringhe wchar_t standard C, allora è necessario wcstombs .

La differenza principale è che wcstombs è una funzione standard, quindi wcstombs se il codice deve essere eseguito su qualsiasi piattaforma diversa da Windows.

wcstombs() è portatile, mentre la funzione WideCharToMultiByte() è solo win32.

Quando si tratta di esso, wcstombs() chiama una funzione specifica del sistema, che su Win32 sarà molto probabilmente una chiamata diretta a WideCharToMultiByte() – tuttavia, potrebbe ignorare completamente questa funzione e andare direttamente all’interno.
In ogni caso, non c’è alcuna differenza pratica.