wwinmain example c++ visual-c++ unicode ansi

c++ - wwinmain - createwindow example



Tipo de proyecto C++: unicode vs multi-byte; pros y contras (6)

¿Hay profesionales que utilicen Unicode directamente desde el principio?

Unos años y un millón de líneas de código más tarde, deseará haber respondido "sí".

lo que implica que todas sus cadenas estarán en formato ancho?

Deseo que Microsoft deje de combinar "Unicode" con UTF-16.

No tiene que almacenar todas sus cadenas en formato ancho. Puede usar UTF-8 en su lugar, y obtener una huella de memoria más pequeña (para los idiomas del alfabeto latino), y compatibilidad con versiones anteriores de ASCII de 7 bits.

La única desventaja de usar UTF-8 en Windows es que no es compatible con una página de códigos ANSI, por lo que debe convertir sus cadenas a UTF-16 para realizar llamadas WinAPI. La cantidad de inconvenientes que esto ocasiona depende de si está escribiendo un programa de Windows o un programa que simplemente se ejecuta en Windows.

Me pregunto qué piensa la comunidad de Stack Overflow cuando se trata de crear un proyecto (pensando principalmente c ++ aquí) con un conjunto de caracteres unicode o multi-byte.

  • ¿Hay profesionales que utilicen Unicode directamente desde el principio, lo que implica que todas sus cadenas estarán en formato ancho? ¿Hay problemas de rendimiento / requisitos de memoria más grandes debido a un uso estándar de un personaje más grande?

  • ¿Hay alguna ventaja en este método? ¿Algunas arquitecturas de procesador manejan mejor los caracteres anchos?

  • ¿Hay alguna razón para hacer que su proyecto sea Unicode si no planea soportar idiomas adicionales?

  • ¿Qué razones tendría para crear un proyecto con un conjunto de caracteres de múltiples bytes?

  • ¿Cómo chocan todos los factores anteriores en un entorno de alto rendimiento (como un videojuego moderno)?


Aquí hay una simple consideración: ¿debería funcionar su programa si el Sr. 菅 直 人 lo usa? Su directorio de inicio puede ser difícil de representar en ASCII.


Dos cuestiones que comentaría.

Primero, no mencionas a qué plataforma estás apuntando. Aunque las versiones recientes de Windows (Win2000, WinXP, Vista y Win7) son compatibles con versiones Multibyte y Unicode de llamadas al sistema utilizando cadenas, las versiones Unicode son más rápidas (las versiones multibyte son envolturas que convierten a Unicode, llaman a la versión Unicode y luego convierten cadenas de nuevo a mutlibyte). Por lo tanto, si realiza muchos de estos tipos de llamadas, el Unicode será más rápido.

El hecho de que no esté planeando apoyar explícitamente idiomas adicionales, aún debería considerar apoyar a Unicode si su aplicación guarda y muestra el texto ingresado por los usuarios. El hecho de que su aplicación sea única, no implica que todos sus usuarios sean también multilingües. Pueden estar perfectamente felices de usar su GUI en inglés, pero pueden querer ingresar nombres, comentarios u otro texto en su propio idioma y hacer que se muestren correctamente.


La respuesta corta (OMI, y he demostrado que no es así) es que es mejor planear para mal (o mejor dependiendo de su punto de vista) y hacer unicode en este momento.

A menos que su aplicación sea muy intensiva en cadenas, ir directamente a Unicode no importará; en el caso de los juegos, no debería ser un factor importante en comparación con el resto del motor.

Max.


Usted está hablando de la configuración del Proyecto VC ++ aquí, ¿verdad?

Lo único que afecta es la versión de las llamadas a la API de Win32 que termina ejecutándose. Por ejemplo, una llamada a MessageBox terminará como una llamada a MessageBoxA en el caso de la configuración de múltiples bytes, y MessageBoxW en el caso de la configuración de Unicode. Por supuesto, eso también afectará los tipos de parámetros de cadena a esas funciones. Internamente, MessageBoxA llama a MessageBoxW después de convertir los parámetros de cadena de la configuración regional actual del sistema a Unicode.

Mi consejo es usar la configuración de Unicode y pasar cadenas Unicode a las llamadas a la API de Win32. Eso no le impide usar cadenas en cualquier otra codificación internamente.