Pregunta

¿Cuál es la diferencia entre UTF y UCS?

¿Cuáles son las mejores maneras de representar conjuntos de caracteres no europeos (usando UTF) en cadenas de C ++? Me gustaría conocer sus recomendaciones para:

  • Representación interna dentro del código
    • Para la manipulación de cadenas en tiempo de ejecución
    • Para usar la cadena con fines de visualización.
  • Mejor representación de almacenamiento ( es decir, en el archivo)
  • Mejor en formato de transporte por cable (Transferencia entre aplicaciones que puede estar en diferentes arquitecturas y tener una configuración regional estándar diferente)
¿Fue útil?

Solución

  

¿Cuál es la diferencia entre UTF y UCS?

Las codificaciones UCS tienen un 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 pueden codificarse 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 puntos de código grandes se codifican utilizando un número mayor de bytes, 4 bytes para 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 por cable (Transferencia entre aplicaciones que puede   estar en diferentes arquitecturas y tener   un locale estándar diferente)
  •   

Para los sistemas modernos, la codificación de transporte y almacenamiento más razonable es UTF-8. Hay casos especiales en los que otros pueden 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 usan más memoria que una cadena UCS-4. Si almacena muchas cadenas grandes con caracteres principalmente en el plano multilingüe básico (BMP), UTF-16 requerirá mucho menos espacio que UCS-4. Fuera del BMP, utilizará la misma cantidad.
  • UCS-4 es más fácil de razonar. Debido a que los caracteres UTF-16 se pueden dividir en varios " pares sustitutos " ;, puede ser difícil dividir o representar correctamente una cadena. El texto UCS-4 no tiene este problema. UCS-4 también actúa como el texto ASCII en " char " arrays, 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 NULOS no están presentes en medio del texto UTF-8, están en UTF-16 o UCS-4.

Otros consejos

sugeriría:

  • Para representación en el código, wchar_t o equivalente.
  • Para representación de almacenamiento, UTF-8.
  • Para representación por cable, UTF-8.

La ventaja de UTF-8 en situaciones de almacenamiento y cableado es que el endianness de la máquina no es un factor. La ventaja de usar un carácter de tamaño fijo como wchar_t en el código es que puede averiguar fácilmente la longitud de una cadena sin tener que escanearla.

UTC es el Tiempo Universal Coordinado, no un conjunto de caracteres (no encontré ningún conjunto de caracteres llamado UTC).

Para la representación interna, es posible que desee utilizar wchar_t para cada carácter, y std :: wstring para cadenas. Usan exactamente 2 bytes para cada carácter, por lo que la búsqueda y el acceso aleatorio serán rápidos.

Para el almacenamiento, si la mayoría de los datos no son ASCII (es decir, el código > = 128), es posible que desee utilizar UTF-16, que es casi lo mismo que wstring y wchar_t .

Como UTF-16 puede ser little endian o big endian, para el transporte por cable, intente convertirlo a UTF-8, que es independiente de la arquitectura.

En la representación interna dentro del código, es mejor que hagas esto tanto con caracteres europeos como no europeos:

\ uNNNN

Los caracteres en el rango \ u0020 a \ u007E, y un poco de espacio en blanco (por ejemplo, al final de la línea) se pueden escribir como caracteres comunes. Cualquier cosa por encima de \ u0080, si lo escribe como un carácter ordinario, se compilará solo en su página de códigos (por ejemplo, OK en Francia pero en Rusia, OK en Rusia pero en Japón, OK en China pero en Estados Unidos, etc. .).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top