2010-06-17 4 views
26

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.Tipo de proyecto C++: unicode vs multi-byte; pros y contras

  • ¿Hay ventajas a ir Unicode directamente desde el principio, lo que implica todas las sus cuerdas será en formato ancho? ¿Hay problemas de rendimiento/mayores requisitos de memoria debido a un uso estándar de un carácter más grande?

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

  • ¿Hay alguna razón para realizar su proyecto Unicode si no planea admitir idiomas adicionales?

  • ¿Qué razones tendría para crear un proyecto con un juego de caracteres de varios bytes?

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

+2

parece un poco subjetivo, también muy parecido a una pregunta que un profesor daría. A saber, estas partes: ¿qué razones tendría para crear un proyecto con un conjunto de caracteres de múltiples bytes? ¿Cómo colisionan todos los factores anteriores en un entorno de alto rendimiento (como un videojuego moderno)? – Woot4Moo

+0

"¿Hay alguna razón para hacer su proyecto Unicode si no planea soportar idiomas adicionales?" Si planea usar caracteres con puntos de código entre 128 y 255, sí. Tratar con páginas de códigos puede ser bastante molesto. – JAB

+1

UTF-8 es un juego de caracteres multibyte (codificación de caracteres de longitud variable), ¿no es así? UTF-16 también es una codificación de caracteres de longitud variable. – dalle

Respuesta

22

Dos problemas 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.

Simplemente porque no está planeando apoyar explícitamente idiomas adicionales, aún debe considerar el soporte de 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.

+2

"aún debe considerar el soporte de Unicode si su aplicación guarda y muestra el texto ingresado por los usuarios", y si su aplicación desea tratar rutas con caracteres arbitrarios, y si se trata de alguna manera con rutas, debería hacerlo. –

+1

Esto es exactamente lo que quería escuchar ... que uno es un envoltorio para el otro. Unicode todo el camino bebé. –

+0

Saludo al bebé Uniking. –

9

La respuesta corta (OMI, y he estado probando mal) es que será mejor para planificar para el peor (o mejor dependiendo de su punto de vista) y hacer Unicode en este momento.

A menos que su aplicación requiera mucho uso de 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.

+0

¿Qué pasa si, por alguna razón mágica, está utilizando una cadena de caracteres en un círculo cerrado? ¿Habrá una diferencia de rendimiento considerable? –

+0

@Stefan: Eso depende de lo que estés haciendo con esa cadena. Si lo está copiando y consiste principalmente en caracteres ASCII, la versión MB será un poco más corta, por lo que copiarla puede ser más rápido. Si está procesando una cadena real, la versión Unicode probablemente será más eficiente debido a su estructura más simple. Pero en realidad, esta es una pregunta hipotética absurdamente hipotética que no tiene sentido. Su respuesta es "no importa el rendimiento, y nunca lo hará, y si lo hace, debe probar ambos y ver qué funciona mejor" – jalf

+0

Además, si importa el rendimiento, puede optimizar ese bucle específico sin cambiar el tipo de proyecto. – Brian

9

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 al 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 al MessageBoxW después de convertir los parámetros de cadena de la configuración regional del sistema actual a Unicode.

Mi consejo es utilizar 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.

4

¿Hay ventajas a ir Unicode directamente desde el principio,

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

implicando 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.

8

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

+0

Excelente punto –

Cuestiones relacionadas