He logrado ignorar todo este material de múltiples bytes, pero ahora necesito hacer un trabajo de interfaz de usuario y sé que mi ignorancia en esta área me va a alcanzar. ¿Alguien puede explicar en unos pocos párrafos o menos lo que necesito saber para poder localizar mis aplicaciones? Qué tipos debo usar (uso tanto .Net como C/C++, y necesito esta respuesta para Unix y Windows).UTF8 vs. UTF16 vs. char * ¿contra qué? ¡Alguien me explique este lío!
Respuesta
Salida de Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
EDITAR 20140523: También, ver Characters, Symbols and the Unicode Miracle por Tom Scott en YouTube - es un poco menos de diez minutos, y una maravillosa explicación de la brillante 'hackear' que es UTF-8
Una codificación de caracteres consiste en una secuencia de códigos que cada uno busca un símbolo de un juego de caracteres dado. Por favor, consulte este buen artículo en Wikipedia on character encoding.
UTF8 (UCS) utiliza de 1 a 4 bytes para cada símbolo. Wikipedia da un buen resumen de cómo funciona el resumen de varios bytes:
- El bit más significativo de un carácter de un solo byte es siempre 0.
- Los bits más significativos del primer byte de un multi -byte sequence determina la longitud de la secuencia. Estos bits más significativos son 110 para secuencias de dos bytes; 1110 para secuencias de tres bytes, y así sucesivamente.
- Los bytes restantes en una secuencia de varios bytes tienen 10 como sus dos bits más significativos .
- Una secuencia UTF-8 no contiene ni el byte FE ni el FF. Esto asegura que un UTF-8 corriente nunca se ve como una corriente UTF-16 empezando por T + FEFF (marca de orden de bytes)
La página también muestra una gran comparación entre las ventajas y desventajas de cada tipo de codificación de caracteres.
utiliza 2 bytes a 4 bytes para cada símbolo.
utiliza 4 bytes siempre para cada símbolo.
char solo significa un byte de datos y no es una codificación real. No es análogo a UTF8/UTF16/ascii. Un puntero char * puede referirse a cualquier tipo de datos y cualquier codificación.
STL:
de std :: wstring y std :: string no están diseñados para de longitud variable, como la codificación de caracteres UTF-8 y UTF-16 Tanto STL.
Cómo implementar:
Tome un vistazo a la biblioteca iconv. iconv es una biblioteca de conversión de codificación de caracteres de gran alcance usada por proyectos tales como libxml (XML C analizador de Gnome)
Otros grandes recursos en la codificación de caracteres:
Brian, esto está mal. UTF-16 usa de 2 a 4 bytes. Solo UTF-32 tiene un ancho fijo de bytes (= 4). La mayoría de las implementaciones de UTF-16 simplemente no se extienden más allá del BMP y, por lo tanto, solo admiten un conjunto de caracteres limitado. –
Gracias Konrad, actualicé mi descripción. –
Personalmente, consideraría usar un char * para señalar que los datos UTF16 son un error. –
Los diversos estándares UTF son formas de codificar "puntos de código". Un punto de código es el índice en el conjunto de caracteres Unicode.
Otra codificación es UCS2 que siempre es de 16 bits, y por lo tanto no es compatible con el rango completo Unicode.
Es bueno saber también que un punto de código no es igual a un carácter. Por ejemplo, un personaje como å puede representarse como un punto de código o como dos puntos de código uno para la a y uno para el anillo.
Comparando dos cadenas Unicode, por lo tanto, se requiere normalización para obtener la representación canónica antes de la comparación.
También está el problema con las fuentes. Hay dos formas de manejar las fuentes. O bien utiliza una fuente gigantesca con glifos para todos los caracteres Unicode que necesita (creo que las versiones recientes de Windows vienen con una o dos de esas fuentes). O utiliza una biblioteca som capaz de combinar glifos de varias fuentes dedicadas a subconjuntos del estándar Unicode.
Received wisdom sugiere que el artículo de Spolsky omite un par de puntos importantes.
En este artículo se recomienda como más completa: The Unicode® Standard: A Technical Introduction
Este artículo es también una buena introducción: Unicode Basics
Este último, en particular, ofrece una visión general de las formas de codificación de caracteres y esquemas para Unicode.
- 1. Char Matriz VS Char *
- 2. char * foo vs char * foo
- 3. ¿por qué el Xdocument me da una declaración utf16?
- 4. Convierta UTF8 a UTF16 con iconv
- 5. Acord Standard for Insurance. ¿Alguien ha lidiado con este lío?
- 6. char vs wchar_t
- 7. std :: string vs. char *
- 8. IDataErrorInfo contra ValidationRule vs Exception
- 9. este vs $ (this)
- 10. Func vs Acción contra predicado
- 11. C++ - char ** argv vs char * argv []
- 12. const char * miVar vs const char miVar []
- 13. uint8_t vs char sin signo
- 14. Perl: utf8 :: decodificar vs. Codificar :: decodificar
- 15. Silverlight vs Flash vs HTML5, ¿me debería importar?
- 16. Explique este fragmento del código
- 17. `Entero` vs` Int64` contra `Word64`
- 18. Objetivo-C: unichar vs. char
- 19. char * vs char ** como parámetros a una función en C
- 20. Mathematica: sin evaluar vs vs Defer Hold vs vs HoldForm HoldAllComplete vs etc, etc
- 21. Generación JPA/Hibernate DDL; CHAR vs. VARCHAR
- 22. ¿Qué es este char? 65279 ''
- 23. matriz de caracteres vs puntero char
- 24. rendimiento entre varchar (1) vs char (1)
- 25. void * vs. char * aritmética del puntero
- 26. partido contra Mysql ... vs simple como "%% término"
- 27. @RunWith (MockitoJUnitRunner.class) vs MockitoAnnotations.initMocks (este)
- 28. bigtable vs cassandra vs simpledb vs dynamo vs couchdb vs hypertable vs riak vs hbase, ¿qué tienen en común?
- 29. Java Optimization String vs Char Arrays
- 30. Programación C principiante - Explique este error
Hehe, cuando leí el título, este fue exactamente el artículo que se me vino a la mente. – VVS
No había leído eso antes ... recibí mi entrenamiento i18n a través de otras vías. Gracias por el enlace – Akrikos
+1 para un artículo enorme y enormemente educativo. –