c++ winapi unicode widechar wchar

c++ - WideCharToMultiByte() vs. wcstombs()



winapi unicode (5)

¿Cuál es la diferencia entre WideCharToMultiByte () y wcstombs () ¿Cuándo usar cuál?


Como con cualquier otra función: use la función que hace lo que necesita en su programa.

WideCharToMultiByte convierte de UTF-16 (utilizado como representación de Win32 WCHAR) a la página de códigos de Win32 de su elección.

wcstombs convierte de la representación interna wchar_t definida por la wchar_t representación interna de múltiples bytes definida por la implementación actual.

Entonces, si su programa es un programa Win32 nativo que usa muchas funciones de la API WIN32 que usan y devuelven cadenas WCHAR, entonces necesita WideCharToMultiByte . Si escribe algunas funciones basadas en la biblioteca estándar (no en la API de Win32) que funcionan con cadenas estándar de wchar_t C, entonces necesita wcstombs .


La principal diferencia es que wcstombs es una función estándar, así que use eso si el código necesita ejecutarse en cualquier plataforma que no sea Windows.


wcstombs() es portátil, mientras que la WideCharToMultiByte() es solo win32.

Cuando se trata de eso, wcstombs() llama a una función específica del sistema, que en Win32 probablemente será una llamada directa a WideCharToMultiByte() , sin embargo, podría pasar por alto esta función por completo e ir directamente a los aspectos internos.
En cualquier caso, no hay diferencia práctica.


En pocas palabras: la WideCharToMultiByte expone las codificaciones / páginas de códigos utilizadas para la conversión en la lista de parámetros, mientras que wcstombs no. Este es un PITA importante, ya que el estándar no define qué codificación se utilizará para producir el wchar_t , mientras que usted, como desarrollador, sin duda necesita saber a qué codificación se está convirtiendo.

Aparte de eso, WideCharToMultiByte es, por supuesto, una función de API de Windows y no está disponible en ninguna otra plataforma.

Por lo tanto, sugeriría usar WideCharToMultiByte sin pensarlo un momento si su aplicación no está escrita específicamente para ser portátil a sistemas operativos que no sean Windows. De lo contrario, es posible que desee luchar con wcstombs o (preferiblemente IMHO) utilizar una biblioteca Unicode portátil con todas las funciones, como la ICU .


  • WideCharToMultiByte es una función de la API de Windows que convierte entre las páginas de códigos multibyte definidas de Windows almacenadas en CHAR y UTF16, almacenadas en WCHAR. La página de códigos que se va a usar se pasa como primer parámetro y se puede pasar como CP_ACP, lo que significa una página de códigos específica para la configuración regional actual del sistema: configurada en la herramienta de localización del panel de control "Idioma para usar en programas que no sean Unicode". Se accede mediante #incluyendo, y está disponible solo en Windows.

  • wcstombs es una función de tiempo de ejecución de C estándar que convierte entre la codificación char * actual de tiempos de ejecución de c-run y la codificación wchar_t *. setlocale iirc se puede usar para configurar las páginas de códigos que se usarán.

  • std :: codecvt es la clase de plantilla de la biblioteca estándar de C ++, utilizada para convertir cadenas entre varias codificaciones utilizando una variedad de mecanismos de tipo rasgos para definir las codificaciones de origen y destino.

Hay otras bibliotecas, incluidas ICONV o ICU que también realizan varias conversiones multibyte <-> Unicode.