utf8 tipos error winapi unicode ascii widechar multibyte-functions

winapi - tipos - API de Windows: ANSI y cadenas de caracteres anchos: ¿es UTF8 o ASCII? UTF-16 o UCS-2 LE?



utf 8 en xml (4)

No soy muy profesional con las codificaciones, pero esto es lo que creo que sé (aunque puede ser incorrecto):

  1. ASCII es una codificación de longitud fija de 7 bits, con los caracteres que puede encontrar en los gráficos ASCII.
  2. UTF8 es una codificación de longitud variable de 8 bits. Todos los personajes se pueden escribir en UTF8.
  3. UCS-2 LE / BE son codificaciones de 16 bits de longitud fija que admiten la mayoría de los caracteres comunes.
  4. UTF-16 es una codificación de longitud variable de 16 bits. Todos los caracteres se pueden escribir en UTF16.

¿Están todos por encima de todo lo correcto?

Ahora, para las preguntas:

  1. ¿Las funciones de Windows "A" (como SetWindowTextA ) toman cadenas ASCII? O "cadenas de múltiples bytes" (más preguntas sobre esto a continuación)?
  2. ¿Las funciones "W" de Windows toman cadenas UTF-16 o cadenas UCS-2? Pensé que aceptan UCS-2, pero los nombres me confunden.
  3. En WideCharToMultiByte , Microsoft usa la palabra "cadena de caracteres anchos" para referirse a UTF-16. En ese contexto, ¿qué se considera una "cadena de múltiples bytes"? UTF-8?
  4. ¿ LPWSTR es una "cadena de caracteres anchos"? Yo diría que sí, pero ¿no significa eso que es UTF-16? ¿Y no significaría que podría usarse para mostrar, digamos, caracteres de 4 bytes? Si no, entonces ... ¿es imposible mostrar los caracteres de 4 bytes? (Windows no parece tener API para ellos).
  5. ¿La funcionalidad de WideCharToMultiByte un superconjunto de la de wcstombs , y ambos funcionan en el mismo tipo de cadena? ¿O, por ejemplo, uno trabaja en UTF-16 mientras que el otro trabaja en UCS-2?
  6. ¿Están las rutas de archivos en UTF-16 o UCS-2? Sé que Windows lo trata como una "matriz opaca de caracteres" de la documentación de Microsoft, pero según el estándar C para funciones como fwprintf , ¿hay alguna codificación estandarizada?
  7. ¿Qué es la codificación "ANSI"? ¿Es ese incluso un término correcto? ¿Y cómo se relaciona con ASCII?
  8. (Tenía más preguntas, pero esto es suficiente ... Olvidé algunas de todas formas ...)

Estas son muchas preguntas, por lo que cualquier enlace a explicaciones sobre cómo se conectan todas estas (además de leer el estándar Unicode, que de todas maneras no ayudará con la API de Windows) sería muy apreciado.

¡Gracias!


¿Están todos por encima de todo lo correcto?

Sí, si no asume la existencia de caracteres no codificados en Unicode (para la mayoría de las aplicaciones prácticas, esta suposición es correcta).

¿Las funciones de Windows "A" (como SetWindowTextA) toman cadenas ASCII? O "cadenas de múltiples bytes" (más preguntas sobre esto a continuación)?

Toman cadenas de bytes (es decir, cadenas cuya unidad de código es un byte, que siempre es un octeto en Windows) codificadas en la codificación actual "ANSI" / MBCS / heredada. "ANSI" son los términos históricos para estas codificaciones, pero no son correctos. Para los sistemas de Windows occidental, esta codificación suele ser Windows-1252.

¿Las funciones "W" de Windows toman cadenas UTF-16 o cadenas UCS-2? Pensé que aceptan UCS-2, pero los nombres me confunden.

Desde Windows 2000, la mayoría de ellos son compatibles con UTF-16. El nombre "ancho" y el resto de la terminología de Microsoft (por ejemplo, "Unicode" que significa "UTF-16" o "UCS") se eligieron antes de que el estándar Unicode moderno unificara la terminología.

En WideCharToMultiByte, Microsoft usa la palabra "cadena de caracteres anchos" para referirse a UTF-16. En ese contexto, ¿qué se considera una "cadena de múltiples bytes"? UTF-8?

Cada otra codificación que WideCharToMultiByte admite es una "codificación de múltiples bytes" en este contexto, incluidos Windows-1251 y UTF-8.

¿LPWSTR es una "cadena de caracteres anchos"? Yo diría que sí, pero ¿no significa eso que es UTF-16? ¿Y no significaría que podría usarse para mostrar, digamos, caracteres de 4 bytes? Si no, entonces ... ¿es imposible mostrar los caracteres de 4 bytes? (Windows no parece tener API para ellos).

LPWSTR es un puntero a wchar_t que siempre es un entero sin signo de 16 bits en Windows. Los caracteres que se pueden mostrar no están relacionados con la codificación, siempre que esa codificación pueda codificar todos los caracteres Unicode. Windows generalmente puede mostrar caracteres no BMP, pero no en todas partes (por ejemplo, la consola no puede).

¿La funcionalidad de WideCharToMultiByte es un superconjunto de la de wcstombs, y ambos funcionan en el mismo tipo de cadena? ¿O, por ejemplo, uno trabaja en UTF-16 mientras que el otro trabaja en UCS-2?

Realmente no lo sé, pero no creo que difieran demasiado. Supongo que solo intentas convertir un carácter que no sea BMP a UTF-8 y ver si el resultado es correcto.

¿Están las rutas de archivos en UTF-16 o UCS-2? Sé que Windows lo trata como una "matriz opaca de caracteres" de la documentación de Microsoft, pero según el estándar C para funciones como fwprintf, ¿hay alguna codificación estandarizada?

Las rutas de archivos son en realidad matrices opacas de caracteres UTF-16, lo que significa que Windows no realiza ningún tipo de traducción al almacenar o leer nombres de archivos (como Linux y, a diferencia de Mac OS X). Pero Windows todavía tiene su raro comportamiento insensible a mayúsculas, en su mayoría no definidas, lo que causa muchos problemas porque los nombres de archivos que son tratados como equivalentes no son necesariamente iguales. Eso rompe muchas invariantes; por ejemplo, en Linux sin interferencias de otros hilos, si crea con éxito dos archivos A y a en algún directorio, terminará con dos archivos distintos, mientras que en Windows obtendrá solo un archivo (y en general, un número impredecible). de archivos).

¿Qué es la codificación "ANSI"? ¿Es ese incluso un término correcto? ¿Y cómo se relaciona con ASCII?

ANSI es la organización de estandarización estadounidense. Usar esta palabra cuando se hace referencia a codificaciones es un nombre inapropiado, pero es frecuente, así que debes ser consciente de ello. Prefiero el término de codificación heredada de 8 bits , porque creo que es esencialmente lo que es: una codificación no Unicode que solo se conserva para la compatibilidad con aplicaciones heredadas (Windows 9x). En los sistemas occidentales, esto suele ser Windows-1252, que es un superconjunto adecuado de ASCII.


  1. * Una función utiliza la página de códigos ANSI activa.

  2. * La función W usa UTF-16.

  3. Multi-byte hace referencia a todo lo que se pasa en el parámetro CodePage. Por lo general, es la página de códigos ANSI activa o UTF-8.

  4. LPWSTR es una cadena UTF-16 que puede o no ser terminada en nulo (ver MSDN )

  5. No sé nada sobre wcstombs, siempre uso WideCharToMultiByte.

  6. Las rutas de archivos están en UTF-16. De hecho, todo el texto es UTF-16 internamente en Windows.

  7. Para la codificación ANSI necesitarás leer sobre eso con cierto detalle. Podría hacer algo peor que comenzar con Wikipedia y seguir los enlaces desde allí.

Espero que eso ayude y que si tengo algo mal, cualquiera que sepa más, edítelo para corregir cualquier error.


En primer lugar, encontrarás mucha información en este tema SO .

ASCII es un juego de caracteres, no de codificación. Ahora, hay una serie de conjuntos de caracteres de 8 bits, uno de ellos configurado como predeterminado en el sistema (puede cambiarlo en Configuración regional). * Las funciones aceptan caracteres de 8 bits en ese juego de caracteres. UTF-8 no es un juego de caracteres, sino una codificación de juego de caracteres Unicode. * Las funciones W, según tengo entendido, usan UTF-16 en lugar de UCS-2.


Las cuerdas anchas solían ser UCS-2. Desde Windows 2000, las cadenas anchas son UTF-16. Es bueno saber si necesita mantener algún viejo sistema heredado.