Cuál es la diferencia entre UTF y UCS.
Las codificaciones de UCS son de ancho fijo, y están marcadas por la cantidad de bytes que se utilizan para cada carácter. Por ejemplo, UCS-2 requiere 2 bytes por carácter. Los caracteres con puntos de código fuera del rango disponible no se pueden codificar en una codificación UCS.
Las codificaciones UTF son de ancho variable, y están marcadas por el número mínimo de bits para almacenar un carácter. Por ejemplo, UTF-16 requiere al menos 16 bits (2 bytes) por carácter. Los caracteres con grandes puntos de código se codifican utilizando una mayor cantidad de bytes: 4 bytes para los caracteres astrales en UTF-16.
- representación interna dentro del código
- mejor representación de almacenamiento (es decir, En archivo)
- mejor en formato de transporte de alambre (transferencia entre la aplicación que pueden estar en diferentes arquitecturas y tienen una configuración regional estándar diferente)
Para los sistemas modernos, la codificación más razonable de almacenamiento y transporte es UTF-8. Existen casos especiales en los que otros podrían ser apropiados: UTF-7 para servidores de correo antiguos, UTF-16 para editores de texto mal escritos, pero UTF-8 es el más común.
La representación interna preferida dependerá de su plataforma. En Windows, es UTF-16. En UNIX, es UCS-4. Cada uno tiene sus puntos buenos:
- Las cadenas UTF-16 nunca utilizan más memoria que una cadena UCS-4. Si almacena muchas cadenas grandes con caracteres principalmente en el plano básico multilingüe (BMP), UTF-16 requerirá mucho menos espacio que UCS-4. Fuera del BMP, usará la misma cantidad.
- UCS-4 es más fácil de razonar. Debido a que los caracteres UTF-16 pueden dividirse en varios "pares de sustitución", puede ser un desafío dividir o representar correctamente una cadena. El texto de UCS-4 no tiene este problema. UCS-4 también actúa de forma similar al texto ASCII en matrices "char", por lo que los algoritmos de texto existentes se pueden portar fácilmente.
Finalmente, algunos sistemas usan UTF-8 como formato interno. Esto es bueno si necesita interoperar con sistemas existentes basados en ASCII o ISO-8859 porque los bytes NULL no están presentes en el medio del texto UTF-8, están en UTF-16 o UCS-4.
No, las codificaciones UTF no son siempre de ancho variable (piénsese en UTF-32, por ejemplo). – bortzmeyer
Utf-32 puede usar un ancho fijo para cada punto de código, pero * creo * todavía puede tener (y necesita aceptar y normalizar a un punto de código) múltiples puntos de código (cuando tiene caracteres combinados) que representan un char/glifo completo. Si es así, UTF-32 no es mucho mejor que UTF-16. – Shadow2531
@bortzmeyer: UTF-32 es realmente solo UCS-4 con algunas restricciones adicionales. Honestamente, nunca he visto UTF-32 usado * en ninguna parte *, así que tiendo a ignorarlo. –