¿Cuál es el punto de UTF-16?

Nunca he entendido el punto de la codificación UTF-16. Si usted necesita para ser capaz de tratar a las cadenas como de acceso aleatorio (es decir, un punto de código es el mismo como una unidad de código), entonces usted necesita UTF-32, ya UTF-16 es todavía de longitud variable. Si usted no necesita esto, entonces UTF-16 parece una colosal desperdicio de espacio en comparación con la codificación UTF-8. ¿Cuáles son las ventajas de la codificación UTF-16 en UTF-8 y UTF-32 y ¿por qué Windows y Java utilizan como su nativo de codificación?

  • Tal vez usted podría reformular su pregunta para que no sea tan subjetivo y argumentativo?
  • Si sólo es cierto para UTF-32… Jugar 5 minutos con la combinación de caracteres en.wikipedia.org/wiki/Combining_character y dime cuánto «al azar» todo lo que es 🙂
InformationsquelleAutor dsimcha | 2011-03-13

5 Kommentare

  1. 48

    Cuando Windows NT fue diseñado UTF-16 no existen (NT 3.51 nació en 1993, mientras que la codificación UTF-16 nació en 1996 con el Unicode 2.0 estándar); por el contrario, había UCS-2, que, en ese momento, era suficiente para contener todos los caracteres disponibles en Unicode, por lo que el 1 de punto de código = 1 código de la unidad de equivalencia en realidad era cierto – no de longitud variable lógica necesaria para las cadenas.

    Se mudaron a UTF-16 más tarde, para apoyar a todo el conjunto de caracteres Unicode; sin embargo, se podía mover a UTF-8 o UTF-32, porque esto se ha roto la compatibilidad binaria en la interfaz API (entre otras cosas).

    Como para Java, no estoy muy seguro; desde que fue lanzado en ~1995 sospecho que UTF-16 ya estaba en el aire (incluso si no estaba normalizado todavía), pero creo que la compatibilidad con sistemas operativos NT-basados pueden haber desempeñado algún papel en su elección (continua UTF-8 <-> UTF-16 conversiones para cada una de las llamadas a las Api de Windows pueden introducir algunos desaceleración).


    Editar

    Wikipedia explica que, incluso para Java se fue de la misma manera: se ha apoyado en UCS-2, pero se mudó a UTF-16 en J2SE 5.0.

    Así que, en general cuando vea UTF-16 usados en algunas API/Framework es porque empezó como UCS-2 (para evitar complicaciones en la cadena de gestión de los algoritmos), pero se trasladó a UTF-16 para apoyar los puntos de código fuera del BMP, aún manteniendo el mismo código de tamaño de la unidad.

  2. 19

    Ninguna de las respuestas indica una ventaja de UTF-16 en UTF-8, en ningún sentido, excepto para la compatibilidad hacia atrás de respuesta.

    Bien, hay dos salvedades a mi comentario.

    Erik dice: «UTF-16 cubre la totalidad de la BMP con unidades individuales – Así que a menos que usted tenga una necesidad para los más raros caracteres fuera del BMP, UTF-16 es efectivamente 2 bytes por carácter.»

    Advertencia 1)

    Si usted puede estar seguro de que su aplicación no necesita ningún personaje fuera de la BMP, y que cualquier biblioteca de código que se escribe para el uso con el que NUNCA podrá ser utilizada con cualquier aplicación que necesite un personaje fuera del BMP, entonces usted podría utilizar UTF-16 y escribir el código que hace la suposición implícita de que cada personaje va a ser exactamente dos bytes de longitud.

    Que parece sumamente peligroso (en realidad, estúpido).

    Si el código se supone que todos los caracteres UTF-16 son dos bytes de longitud, y su programa interactúa con una aplicación o biblioteca en la que hay un único carácter fuera de la BMP, entonces el código se va a romper. Código en el que se analiza o manipula UTF-16 debe ser escrito para manejar el caso de una de caracteres UTF-16 que requieren más de 2 bytes; por lo tanto, yo soy «despedir» a partir de esta premisa.

    UTF-16 no es más sencillo de código de UTF-8 (código para manejar y de longitud variable de caracteres).

    Advertencia 2)

    UTF-16 PUEDE ser más eficiente computacionalmente, en algunas circunstancias, si adecuadamente por escrito.

    Así: Supongamos que ciertas cadenas largas son rara vez modificado, pero a menudo se examinan (o mejor, nunca modificado una vez construido – es decir, un generador de cadenas de creación de inmodificable cadenas). Una bandera puede ser establecido para cada cadena, que indica si la cadena contiene solo «de longitud fija» de los personajes (es decir, no contiene caracteres que no son exactamente dos bytes de longitud). Las cadenas para que la bandera es cierto podría ser examinados con el código optimizado que supone de longitud fija (2 bytes) caracteres.

    Cómo sobre el espacio-eficiencia?

    UTF-16 es, obviamente, más eficiente para A) caracteres para que UTF-16 requiere un menor número de bytes para codificar que el UTF-8.

    UTF-8 es, obviamente, más eficiente para B) caracteres para que UTF-8 requiere un menor número de bytes para codificar que el UTF-16.

    Excepto para los muy «especializados» de texto, es probable que contar(B) excede count(A).

  3. 3

    UTF-16 cubre la totalidad de la BMP con unidades individuales – Así que a menos que usted tenga una necesidad para los más raros caracteres fuera del BMP, UTF-16 es efectivamente 2 bytes por carácter. UTF-32 necesita más espacio, UTF-8 requiere de longitud variable de apoyo.

    • Voy a añadir el necesario wiki referencia a UTF-32, que explica todas las desventajas: en.wikipedia.org/wiki/UTF-32/UCS-4
    • Usted puede decir algo como UTF-8 es, efectivamente, un byte por carácter… a menos que necesite raros personajes fuera de ASCII. En realidad, UTF-16 es igual de longitud variable como UTF-8.
    • Yo trabajo con el Japonés characteres (o francés), en realidad estamos pensando en usar UTF-16. Me hubiera gustado que este debate para incluir cómo la variable de quienes son y si el uso de UTF-16 puede ser más optimizado para diferentes grados de no-ASCII-ness
    • UTF-8 cubre todo el ASCII con unidades individuales – Así que a menos que usted tenga una necesidad para los más raros caracteres, UTF-8 es efectivamente 1 byte por carácter, no de longitud variable.
  4. 1

    UTF16 se utiliza generalmente como una asignación directa a los juegos de caracteres multibyte, es decir, onyl el original 0-0xFFFF caracteres asignados.

    Esto le da a usted el mejor de ambos mundos, que se han fijado el tamaño de los caracteres, pero todavía se puede imprimir todos los caracteres de cualquier persona es susceptible de utilizar (ortodoxa Klingon religiosa secuencias de comandos de semana)

    • A menos que seas de Hong Kong, ya que incluso Cantonés frases pueden requerir personajes fuera de la BMP. Además, no hay diversión como la diversión que puede venir de tener un programa de rechazar algunos caracteres válidos para ninguna razón para que el usuario final pueda ver.
  5. 1

    UTF-16 permite a todos los del plano multilingüe básico (BMP) para ser representados como simples unidades de código. Puntos de código Unicode más allá de U+FFFF están representados por los pares suplentes.

    Lo interesante es que el Java y Windows (y otros sistemas que utilizan la codificación UTF-16) funcionan en el código de nivel de la unidad, no el punto de código Unicode nivel. Así, la cadena que consiste en el carácter U+1D122 (MUSICAL SÍMBOLO F de la CLAVE de sol) obtiene codificado en Java como «\ud824\udd22» y "\ud824\udd22".length() == 2 (no 1). Así que es un tipo de hack, pero resulta que los personajes no son de longitud variable.

    La ventaja de UTF-16 en UTF-8, es que a uno le dan demasiado si el mismo hack se han utilizado con UTF-8.

    • Me cree (sí, me cree 🙂 ) que el mundo sería mejor si los programadores tenían que saber de caracteres de longitud variable, en lugar de descubrir que «casualmente» (como es ahora, un programador podría vivir años sin saber que un punto de código podría ser de largo 2, si todo estaba en UTF-8, podía mantener la cabeza debajo de la tierra sólo por algunos meses 🙂 )

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea