Diferencia entre revisiones de «UTF-8»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Sin resumen de edición
m Revertidos los cambios de 193.144.2.254 (disc.) a la última edición de 190.87.67.47
Línea 1: Línea 1:
'''UTF-8''' (8-[[bit]] [[Unicode Transformation Format]]) es un formato de codificación de caracteres [[Unicode]] e [[ISO 10646]] utilizando símbolos de longitud variable. UTF-8 fue creado por [[Rob Pike|Robert C. Pike]] y [[Ken Thompson|Kenneth L. Thompson]]. Está definido como estándar por la RFC 3629 de la [[Internet Engineering Task Force]] (IETF).<ref name="UTF-8">{{cita web | url=http://tools.ietf.org/html/rfc3629 | título=RFC 3629 - UTF-8, un formato de transformación de ISO 10646
zazazadfgses —[[grafema]]s— definiéndolos de forma abstracta y deja la representación visual (tamaño, dimensión, fuente o estilo) al software que lo trate, como [[procesador de texto|procesadores de texto]] o [[navegador web|navegadores web]]. Se incluyen letras, signos diacríticos, caracteres de puntuación, ideogramas, caracteres silábicos, caracteres de control y otros símbolos. Los caracteres se agrupan en alfabetos o sistemas de escritura. Se considera que son diferentes los caracteres de alfabetos distintos, aunque compartan forma y significación.
| autor = F. Yergeau | fecha=Noviembre [[2003]]| editorial=[[Internet Society]]| fechaacceso=20/05/2009}}</ref> Actualmente es una de las tres posibilidades de codificación reconocidas por Unicode y lenguajes web, o cuatro en [[ISO 10646]].


Sus características principales son:
Los caracteres se identifican mediante un número o punto de código y su nombre o descripción. Cuando se ha asignado un código a un carácter, se dice que dicho carácter está ''codificado''. El espacio para códigos t
* Es capaz de representar cualquier carácter Unicode.
|caption= Caracter alfay disciplinas técnicas además de textos clásicos de lenguas muertas. El término Unicode proviene de los tres objetivos perseguidos: universalidad, uniformidad y unicidad.<ref name="RESUMEN-HISTORICO">{{cita web |url=http://www.unicode.org/history/summary.html |título= Resumen histórico |editorial= Unicode, Inc. |fechaacceso=21 de mayo de 2009}}</ref>
* Usa símbolos de longitud variable (de 1 a 4 bytes por carácter Unicode).
* Incluye la especificación [[ASCII|US-ASCII]] de 7 bits, por lo que cualquier mensaje ASCII se representa sin cambios.
* Incluye sincronía. Es posible determinar el inicio de cada símbolo sin reiniciar la lectura desde el principio de la comunicación.
* No superposición. Los conjuntos de valores que puede tomar cada byte de un caracter multibyte, son disjuntos, por lo que no es posible confundirlos entre si.


Estas características lo hacen atractivo en la codificación de correos electrónicos y páginas web.<ref name="GoogleUnicode">{{cita web | url=http://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html | título=Moving to Unicode 5.1 | fecha=[[5 de mayo]] de [[2008]] | editorial=Official Google Blog| fechaacceso=20-05-2009}}</ref> El [[IETF]] requiere que todos los protocolos de [[Internet]] indiquen qué [[código de caracteres|codificación]] utilizan para los textos y que UTF-8 sea una de las codificaciones contempladas.<ref name="ITF">{{cita web | url=http://tools.ietf.org/html/rfc2277 | título=RFC 2277 - Política oficial de IETF sobre juegos de caracteres e idiomas| autor = H. Alvestrand | fecha=Enero [[1998]]| editorial=[[Internet Engineering Task Force]]| fechaacceso=20/05/2009}}</ref> El [[Internet Mail Consortium]] (IMC) recomienda que todos los programas de correo electrónico sean capaces de crear y mostrar mensajes codificados utilizando UTF-8.<ref name="IMC">{{cita web|url=http://www.imc.org/mail-i18n.html | title=Utilización de Caracteres Internacionales en el Correo de Internet | fecha=[[1 de agosto]] de [[1998]] | editorial =Internet Mail Consortium | fechaacceso=20/5/2008}}</ref>
Unicode especifica un nombre e identificador numérico único para cada carácter o símbolo, el ''code point'' o ''punto de código'', además de otras informaciones necesarias para su uso correcto: direccionalidad, capitalización y otros atributos. Unicode trata los caracteres alfabéticos, ideográficos y símbolos de forma equivalente, lo que significa que se pueden mezclar en un mismo texto sin la introducción de marcas o caracteres de control.<ref name="UNICODE-ABOUT">{{cita web |url= http://www.unicode.org/standard/standard.html |título= About the Unicode Standard |editorial= Unicode, Inc. |fechaacceso=21 de mayo de 2009}}</ref>


== Historia ==
UTF-8 fue ideado por [[Ken Thompson|Kenneth L. Thompson]] bajo los criterios de diseño de [[Rob Pike|Robert C. Pike]] el 2 de septiembre de [[1992]]. Ambos lo implementaron e implantaron en su [[sistema operativo]] [[Plan 9 from Bell Labs]]. Posteriormente fue oficialmente presentado en la conferencia [[USENIX]] en [[San Diego (California)|San Diego]] en Enero de [[1993]]. Fue promovido a estándar con el patrocinio de X/Open Joint Internationalization Group (XOJIG) y durante el proceso recibió diferentes nombres como FSS/UTF y UTF-2.<ref name="UTF-8"></ref>


== Descripción ==
cvbcvEl '''Estándar Unicode''' es un [[estandarización|estándar]] de codificación de caracteres diseñado para facilitar el tratamiento informático, transmisión y visualización de textos de múltiples lenguajes o de 2009}}</ref> El Unicode Consortium mantiene estrecha relación con ISO/IEC, con la que mantiene un acuerdo desde 1991 con el objetivo de mantener la sincronización entre sus estándares que contienen los mismos caracteres y puntos de código.<ref name="UNICODE-ISO">{{cita libro |autor= The Unicode Consortium |editor= Julie D. Allen, Joe Becker (et al.) |título= Unicode 5.0 standard|capítulo=Appendix C. Relationship to ISO/IEC10646 |url=http://www.unicode.org/versions/Unicode5.0.0/appC.pdf |fecha= [[octubre de 2006]] |año= [[2006]] |mes= [[octubre]] |editorial= Addisson-Wesley |idioma= Inglés |isbn= 0-321-48091-0}}</ref>
UTF-8 divide los caracteres Unicode en varios grupos, en función del número de bytes necesarios para codificarlos. El número de bytes depende exclusivamente del código de carácter asignado por Unicode y del número de bytes necesario para representarlo. La distribución de caracteres es la siguiente:


* Caracteres codificados con un byte: Los incluidos en US-ASCII, un total de 128 caracteres.
El establecimiento de Unicode ha sido un ambicioso proyecto para reemplazar los esquemas de [[codificación de caracteres]] existentes, muchos de los cuales están muy limitados en tamaño y son incompatibles con entornos plurilingües. Unicode se ha vuelto el más extenso y completo esquema de codificación de caracteres, siendo el dominante en la [[Internacionalización (computación)|internacionalización]] y adaptación local del [[software|software informático]]. El estándar ha sido implementado en un número considerable de tecnologías recientes, que incluyen [[XML]], [[Lenguaje de programación Java|Java]] y [[sistemas operativos]] modernos.
* Caracteres codificados con dos bytes: Un total de 1920 caracteres. Este grupo incluye los caracteres latinos más signos diacríticos, y los alfabetos [[alfabeto griego|griego]], [[alfabeto cirílico|cirílico]], [[alfabeto copto|copto]], [[alfabeto armenio|armenio]], [[alfabeto hebreo|hebreo]], [[alfabeto árabe|árabe]], [[alfabeto siríaco|siríaco]] y [[Thaana]] entre otros.
* Caracteres codificados con tres bytes: Caracteres del Plano básico multilingüe de Unicode, que unido al grupo anterior, incluye la práctica totalidad de caracteres de uso común, entre ellos los caracteres del grupo [[CJK]]: Chino, japonés y coreano.
* Caracteres codificados con cuatro bytes: Caracteres del plano suplementario multilingüe. Símbolos matemáticos y alfabetos clásicos para uso principalmente académico: [[Lineal B]] silábico e ideográfico, alfabeto persa, fenicio... Y el plano suplementario ideográfico: caracteres [[Han]] de uso poco común.


Una propiedad importante de la codificación es que los bits más significativos del primer byte de una secuencia multi-byte determinan la longitud de la secuencia. Estos bits más significativos 110 para secuencias de dos bytes; 1110 para secuencias de tres bytes, etc. Estos bits además proporcionan la información de sincronía que permite identificar el inicio de un símbolo.
La descripción completa del estándar y las tablas de caracteres están disponibles en la página web oficial de Unicode [http://www.unicode.org/charts/]. La referencia completa se publica, además, en forma de libro impreso cada vez que se libera una nueva versión principal. La versión digital de este libro está disponible de forma gratuita. Las revisiones y adiciones se publican de forma independiente.


La tabla siguiente muestra la forma en que se codifican los caracteres. Los valores fijos al principio de cada byte garantizan el cumplimento del principio de no superposición, pues son distintos en función de la posición del byte en la cadena.
== Cobertura ==
{{Cuadroimagen
|width=350
Este estándar es mantenido por el ''Unicode Technical Committee'' (UTC), integrado en el Unicode Consortium, dacceso=21 de maybético latino ''A'', sílaba devanagari Aum (Om), e ideograma chino yue (luna).
|align=right
|content=[[Archivo:Letter A.svg|100px]] [[Archivo:Aum.svg|100px]] [[Archivo:074 - yue4 - moon.svg|101px]]
}}
Unicode incluye todos los caracteres de uso común en la actualidad. La versión 5.1 contiene 100.713 caracteres provenientes de alfabetos, sistemas ideográficos y colecciones de símbolos (matemáticos, técnicos, musicales, iconos...). La cifra crece en cada versión.


<small>
Unicode incluye sistemas de escritura modernos como: [[Alfabeto árabe|Árabe]], [[Braille (lectura)|Braille]], [[Alfabeto copto|Copto]], [[Alfabeto cirílico|Cirílico]], [[Alfabeto griego|Griego]], [[Escritura china|Han]] ([[Kanji]], [[Hanja]] y [[Hanzi]]), [[Escritura japonesa|Japonés]] ([[Kanji]], [[Hiragana]] y [[Katakana]]), [[Alfabeto hebreo|Hebreo]] y [[Alfabeto latino|Latino]]. Escrituras históricas menos utilizadas, incluso aquellas extinguidas, para propósitos académicos, como por ejemplo: [[Escritura cuneiforme|Cuneiforme]], [[Alfabeto griego|Griego antiguo]], [[Lineal B]] micénico, [[Alfabeto fenicio|Fenicio]] y [[Runa (escritura)|Rúnico]]. Entre los caracteres que no forman parte de alfabetos se encuentran símbolos musicales y mel que forman parte con distinto grado de implicación empresas como: Microsoft, Apple, Adobe, IBM, Oracle, SAP, Google, instituciones como la Universidad de Berkeley, y profesionales y académicos a título individual.<ref name="UNICODE-MEMBERS">{{cita web |url= http://www.unicode.org/standard/standard.html |título= The Unicode Consortium Members |editorial= Unicode, Inc. |fechaatemáticos, fichas de juegos como el dominó, flechas, iconos, etc. Además Unicode dispone de versiones predefinidas de la mayoría de combinaciones de letras y símbolos diacríticos en uso en la actualidad y define mecanismos de combinación de caracteres.


{| class="wikitable" border="1"
Actualmente se está trabajando en la inclusión de nuevos grupos de símbolos como los jeroglíficos egipcios y mayas.<ref name="UNICODE-ROADMAP">{{cita web |url= http://www.unicode.org/roadmaps/index.html |título= Roadmaps to Unicode |editorial= Unicode, Inc. |fechaacceso=21 de mayo de 2009}}</ref> Otros alfabetos propuestos han sido descartados por distintas razones, como por ejemplo el alfabeto [[Klingon]].<ref name="UNICODE-ROADMAP" /><ref name="UNICODE-RECHAZO">{{cita web |url= http://unicode.org/alloc/nonapprovals.html |título= Archive of Notices of Non-Approval |editorial= Unicode, Inc. |fechaacceso=21 de mayo de 2009}}</ref>
|-----

| Rango de Código<br />[[UNICODE]]<br />[[hexadecimal]]
Como ya se ha indicl=http://www.unicode.org/versions/Unicode5.0.0/bookmarks.html |fecha= [[octubre de 2006]] |año= [[2006]] |mes= [[octubre]] |editorial= Addisson-Wesley |idioma= Inglés |isbn= 0-321-48091-0}}</ref>
| [[UTF-16]]

| UTF-8
== Principios de diseño ==
| Notas

|-----
El estándar fue diseñado con los siguientes objetivos:
| <code>000000 - 00007F</code> || <code>00000000 0xxxxxxx</code>

| <code>0xxxxxxx</code>
* '''Universalidad''': Un repertorio suficientemente amplio que albergue a todos los caracteres probables en el intercambio de texto multilingüe.
| Rango equivalente a US-ASCII. Símbolos de un único byte donde el bit más significativo es 0
* '''Eficiencia''': Las secuencias generadas deben ser fáciles de tratar.
|-----
* '''No ambigüedaado, Unicode está sincronizado con el estándar ISO/IEC 10646:2003, conocido como [[UCS]] o juego de caracteres universal. Desde un punto de vista técnico, incluye codificaciones anteriores como ASCII7 o [[ISO 8859-1]], los estándares nacionales ANSI Z39.64, KS X 1001, JIS X 0208, JIS X 0212, JIS X 0213, GB 2312, GB 18030, [[HKSCS]], y [[CNS 11643]], codificaciones particulares de fabricantes de software como Apple, Adobe, Microsoft, IBM, etc. Además, Unicode reserva espacio para uso privado por fabricantes de software.<ref name="UNICODE">{{cita libro |autor= The Unicode Consortium |editor= Julie D. Allen, Joe Becker (et al.) |título= Unicode 5.0 standard |urd''': Un código dado siempre representa el mismo carácter.
| <code>000080 - 0007FF</code> || <code>00000xxx xxxxxxxx</code>

| <code>110xxxxx 10xxxxxx</code>
== Elementos del estándar Unicode ==
| align="top" | Símbolos de dos bytes. El primer byte comienza con 110, el segundo byte comienza con 10
=== Caracteres, puntos de código y espacio de códigos ===
|-----

| <code>000800 - 00FFFF</code> || <code>xxxxxxxx xxxxxxxx</code>
El elemento básico del estándar Unicode es el [[carácter]]. Se considera un carácter al elemento más pequeño de un lenguaje escrito con significado. El estándar Unicode codifica los caracteres esencialiene 1.114.112 posiciones posibles (0x10FFFF). Los puntos de código se representan utilizando notación hexadecimal agregando el prefijo U+. El valor hexadecimal se completa con ceros hasta 4 dígitos hexadecimales cuando es necesario; si es de longitud mayor que 4 dígitos no slas de combinación, etc.
| <code>1110xxxx 10xxxxxx 10xxxxxx</code>

| align="top" | Símbolos de tres bytes. El primer byte comienza con 1110, los bytes siguientes comienzan con 10
==== Organización del espacio de códigos ====
|-----

| <code>010000 - 10FFFF</code>
Con excepciones, los ce agregan ceros.
| <code>110110xx xxxxxxxx<br />110111xx xxxxxxxx</code>

| <code>11110xxx 10xxxxxx 10xxxxxx 10xxxxxx</code>
==== Base de datos de caracteres ====
| Símbolos de cuatro bytes. El primer byte comienza con 11110, los bytes siguientes comienzan con 10

|}
El conjunto de caracteres codificados por Unicode, es la Base de Datos Unicode o UCD (''Unicode Character Database''). Además de nombre y punto de código, incluye mas información: alfabeto al que pertenece, nombre, clasificación, capitalización, orientación y otras formas de uso, variantes estandarizadas, regaracteres codificados sea agrupan en el espacio de códigos siguiendo categorías como alfabeto o sistema de escritura, de forma que caracteres relacionados se encuentren cerca en tablas de codificación.
</small>

Siguiendo el esquema anterior, sería posible incrementar el tamaño máximo del símbolo de 4 a 6 bytes. La definición de UTF-8 dada por Unicode no admite esta posibilidad que sí es admitida por ISO/IEC.<ref name="UNICODE-UTF">{{cita libro |autor= The Unicode Consortium |editor= Julie D. Allen, Joe Becker (et al.) |título= Unicode 5.0 standard |capítulo= 2.5 Encoding Forms |url=http://www.unicode.org/versions/Unicode5.0.0/bookmarks.html |fecha= [[octubre de 2006]] |año= [[2006]] |mes= [[octubre]] |editorial= Addisson-Wesley |idioma= Inglés |isbn= 0-321-48091-0}}</ref>
=== Planos ===

Por conveniencia se ha dividido el espacio de códigos en grandes grupos denominados ''planos''. Cada plano contiene un máximo de 65.535 caracteres. Dado un punto de código expresado en hexadecimal, los 4 últimos dígitos determinan la posición del carácter en el plano.

* '''Plano básico multilingüe''': BMP o plano 0. Contiene la mayor parte de los alfabetos modernos, incluyendo los caracteres más comunes del sistema CJK, otros caracteres históricos o poco habituales y 6.400 posiciones reservadas para uso privado.

* '''Plano suplementario multilingüe''': SMP o plano 1. Alfabetos históricos de menor uso y sistemas de uso técnico u otros usos.

* '''Plano suplementario ideográfico''': SIP o plano 2. Contiene los caracteres del sistema CJK que no se incluyen en el plano 0. La mayoría son caracteres muy raros o de interés histórico.

* '''Plano de propósito especial''': SSP o plano 14. Área para caracteres de control que no se han introducido en el plano 0.

* '''Planos de uso privado''': Planos 15 y 16. Reservados para uso privado por fabricantes de software.

=== Áreas y Bloques ===

Los distintos planos se dividen en áreas de direccionamiento en función de los tipos generales que incluyen. Esta división es convencional, no reglada y puede variar con el tiempo. Las áreas se dividen, a su vez, en bloques. Los bloques están definidos normativamente y son rangos consecutivos del espacio de códigos. Los bloques se utilizan para formar las tablas impresas de caracteres pero no deben tomarse como definiciones de grupos significativos de caracteres.


== Repertorio de caracteres ==
=== Tipos de caracteres ===
{{Cuadroimagen
{{Cuadroimagen
|width=350
|width=350
|caption= Ejemplo: Codificación del carácter [[Unicode]] ''ñ''.
|caption= Distintas versiones del carácter [[Angstrom]], como carácter (versión preferida), como carácter con signo diacrítico y como símbolo con forma de letra.
|align=right
|align=right
|content=[[Archivo:Angstrom unicode sample.svg|350px]]
|content=[[Archivo:Codificación UTF-8.svg|350px]]
}}Veamos, a modo de ejemplo, cómo se codifica en UTF-8 el carácter eñe ('ñ'), que se representa en Unicode como 0x00F1:
}}Los bloques del espacio de códigos contienen puntos con la siguiente información:<ref name="UNICODE-CODIGOS">{{cita libro |autor= The Unicode Consortium |editor= Julie D. Allen, Joe Becker (et al.) |título= Unicode 5.0 standard|capítulo=16. Special Areas and Format Characters |url=http://www.unicode.org/versions/Unicode5.0.0//ch16.pdf |fecha= [[octubre de 2006]] |año= [[2006]] |mes= [[octubre]] |editorial= Addisson-Wesley |idioma= Inglés |isbn= 0-321-48091-0}}</ref>
* Su valor se sitúa en el rango de 0x0080 a 0x07FF. Una consulta a la tabla permite ver que debe ser codificado usando 2 bytes, con el formato ''110''xxxxx ''10''xxxxxx.
* El valor [[hexadecimal]] 0x00F1 es equivalente al [[binario]] (0000-0)'''000-1111-0001''' (los primeros 5 bits se ignoran, ya que no son necesarios para representar valores en el rango especificado).
* Los 11 bits requeridos se sitúan ordenados en la posición marcada por las equis: ''110'''''00011''' ''10'''''110001'''.
* El resultado final son dos bytes con los valores hexadecimales 0xC3 0xB1. Ese es el código de la letra eñe en UTF-8.


Para recuperar el punto de código original se realiza el proceso inverso, descomponiendo las secuencias de bits en sus componentes y tomando solo los bits necesarios.
'''Caracteres gráficos''': Letras, signos diacríticos, números, caracteres de puntuación, símbolos y espacios.


=== Errores de codificación ===
'''Caracteres de formato''': Caracteres invisibles que afectan al proceso del texto próximo. Ejemplos: U+2028 ''salto de línea'', U+2029 ''salto de párrafo'', U+00A0 ''no break space'', etc.


Las normas de codificación establecen, por lo tanto, límites a las cadenas que se pueden formar. Según la norma, un intérprete de cadenas debe rechazar como inválidos, y no tratar de interpretar, las caracteres mal formados. Un intérprete de cadenas UTF-8 puede cancelar el proceso señalando un error, omitir los caracteres mal formados o reemplazarlos por un caracter U+FFFD (''REPLACEMENT CHARACTER'').
'''Códigos de control''': 65 códigos definidos por compatibilidad con ISO/IEC 2022. Son los caracteres entre en los rangos [U+0000,U+001F], U+007F y [U+0080..U+009F]. Interpretarlos es responsabilidad de protocolos superiores.


Los siguientes son errores de codificación:
'''Caracteres privados''': Reservados para el uso fuera del estándar por fabricantes de ''software''.
* Secuencias truncadas, cuando un carácter de inicio multi-byte no está seguido por suficientes bytes.
* Bytes de datos (comenzados por 10) sin el correspondiente inicio de carácter.
* Caracteres anómalamente largos: Por ejemplo, representar con 2 bytes un carácter del rango ASCII de un byte. Los bytes <code>0xC0</code>, <code>0xC1</code> no se admiten.
* Bytes de inicio de carácter que especifican un largo anómalo de 5 o 6 bytes. Los bytes <code>0xF8</code> a <code>0xFD</code> no se admiten.
* Caracteres fuera del rango Unicode: Los bytes <code>0xF5</code> y <code>0xF7</code> no se admiten.
* Caracteres inválidos. Los caracteres en el rango de pares subrogados de UTF-16, con código de <code>0xD800</code> a <code>0xDFFF</code>, no son caracteres reales y no deben codificarse en UTF-8.


=== Byte order mark (BOM) ===
'''Caracteres reservados''': Códigos reservados para su uso por Unicode. Son posiciones no asignadas.


Cuando se sitúa al inicio de una cadena UTF-8, un carácter <code>0xFEFF</code>, codificado en UTF-8 como <code>0xEF</code>,<code>0xBB</code>,<code>0xBF</code>, se denomina Byte Order Mark (BOM) e identifica el contenido como una cadena de caracteres Unicode. Cuando este carácter se encuentra en otro lugar de la cadena debe ser interpretado con su significado original Unicode (<code>ZWNBSP</code>). Al ser UTF-8 una codificación en la que la unidad de información es el byte, no tiene la utilidad que sí tiene en UTF-16 y UTF-32 de identificar el orden de bytes en una palabra (''[[endianness]]'').
'''Puntos de código subrogados''': Unicode reserva los puntos de código de U+D800 a U+DFFF para su uso como códigos subrogados en UTF-16, en la representación de caracteres suplementarios.


La especificación no recomienda o desaconseja la utilización de BOM, aunque sí desaconseja eliminarlo si existe como medida de seguridad, previendo errores en aplicaciones de firma digital, etc. También advierte que debe ser eliminado en operaciones de concatenación para impedir que se mantenga en posiciones no iniciales.
'''No-caracteres''': Son códigos reservados permanentemente para uso interno por Unicode. Los dos últimos puntos de cada plano U+FFFE y U+FFFF.


== Derivaciones de UTF-8 ==
'''Caracteres descartados''': Son caracteres que se retienen por compatibilidad conversiones anteriores, pero se debe evitar su uso.


Las siguientes normas de codificación presentan diferencias con la especificación UTF-8 y son, por lo tanto, '''incompatibles''' con ella.
=== Repertorio unificado chino, coreano y japonés ===


=== CESU-8 ===
Los ideogramas de Asia oriental (popularmente llamados ''caracteres chinos'') se denominan ''ideogramas Han'' en el Estándar Unicode. Estos ideogramas se desarrollaron en China y fueron adaptados por culturas próximas para su propio uso.<ref name="UNICODE-HAN1">{{cita web |título=On the Encoding of Latin, Greek, Cyrillic, and Han |url=http://www.unicode.org/notes/tn26/}}</ref><ref name="UNICODE-HAN2">{{cita libro |título=Unicode 5.0 Standard |url=http://www.unicode.org/versions/Unicode5.0.0/ch12.pdf | capítulo=12. East Asian Scripts}}</ref> [[Japón]], [[Corea]] y [[Vietnam]] desarrollaron sus propios sistemas alfabéticos o silábicos para usar en combinación con los símbolos chinos: ''[[hiragana]]'' y ''[[katakana]]'' en Japón, ''[[hangul]]'' en Corea y [[Yi]] en Vietnam. La evolución natural de los sistemas de escritura y los distintos momentos de entrada de los caracteres en las distintas culturas han marcado diferencias en los ideogramas utilizados. Unicode considera las distintas versiones de los ideogramas como variantes de un mismo carácter abstracto, es decir, como resultado de la aplicación de un [[tipo de letra]] diferente en cada caso y considera las variantes nacionales como pertenecientes a un mismo sistema de escritura. La versión original del estándar se desarrolló a partir de los estándares industriales existentes en los paises afectados.


Esta implementación realiza una traducción directa de la cadena de caracteres representada con UTF-16 en lugar de codificar los puntos de código Unicode. El resultado es codificaciones diferentes para caracteres Unicode con código superior a <code>0xFFFF</code>.<ref name="UTF-8"></ref> [[Oracle]], a partir de la versión 8, implementa CESU-8 con el alias ''UTF8'' y, a partir de la versión 9, UTF-8 estándar con otro alias.<ref name="ORACLE">{{cita web | url=http://www.oracle.com/technology/tech/globalization/pdf/TWP_AppDev_Unicode_10gR2.pdf | título=Globalization Support. Oracle Unicode database support.| autor = Simon Law | fecha=[[Mayo de 2005]]| editorial=[[Oracle Corporation]]| fechaacceso=20/05/2009}}</ref> Java y Tcl utilizan esta codificación.{{cita requerida}}
El organismo encargado de desarrollar el repertorio de caracteres es el [[Ideographic Rapporteur Group]] (IRG). IRG es un grupo de trabajo integrado en ISO/IEC JTC1/SC2/WG2, incluyendo a [[China]], [[Hong Kong]], [[Macao]], [[Taipei Computer Association]], [[Singapur]], [[Japón]], [[Corea del Sur]], [[Corea del Norte]] , [[Vietnam]] y [[Estados Unidos de América]].<ref name="UNICODE-HAN1" />


=== UTF-8 modificado ===
La base de datos de caracteres CJK se denomina '''Unihan''' y contiene, además, información auxiliar sobre significado, conversiones, datos necesarios para utilizarlos en los diferentes lenguajes que los utilizan. A continuación se muestran los bloques que describen este repertorio. IRG define los caracteres de los tres grupos unificados, los siguientes dos grupos contienen caracteres para compatibilidad con estándares anteriores.


Con UTF-8 modificado, el carácter ''nulo'' se codifica como <code>0xC080</code> en lugar de <code>0x00</code>. De esta forma un texto que contenga el carácter nulo no contendrá el byte <code>0x00</code> y, por lo tanto, no se truncará en lenguajes como C que consideran <code>0x00</code> un final de cadena.
{| class="wikitable"
|-
| '''Bloque'''
| '''Rango de códigos'''
| '''Comentarios'''
|-
| Ideogramas unificados CJK
| 4E00-9FFF
| Ideogramas de uso común. Tamaño de código 2 bytes.
|-
| Ideogramas unificados CJK - Extensión A
| 3400-4DFF
| Ideogramas de uso poco habitual. Tamaño de código 2 bytes.
|-
| Ideogramas unificados CJK - Extensión B
| 20000-2A6DF
| Ideogramas de uso poco habitual e históricos.
|-
| Ideogramas de compatibilidad
| F900-FAFF
| Duplicados, variantes unificables y caracteres corporativos. Tamaño de código 2 bytes.
|-
| Suplemento de ideogramas de compatibilidad
| 2F800-2FA1F
| Variantes unificables.
|}


Todas las implementaciones conocidas de UTF-8 modificado cumplen, además, con CESU-8{{cita requerida}}.
=== Composición de caracteres y secuencias ===
{{Cuadroimagen
|width=250
|caption=Composición del carácter '''"ñ"'''. La primera es un carácter independiente, la segunda una '''n''' más una tilde combinable.
|align=right
|content=[[Archivo:Composicion nh.svg|250px]]
}} Unicode incluye un mecanismo para formar caracteres y así extender el repertorio de compatibilidad con los símbolos existentes. Un carácter base se complementa con marcas: signos diacríticos, de puntuación o marcos. El tipo de cada carácter y sus atributos definen el papel que pueden jugar en una combinación. Por este motivo, puede haber varias opciones que representen el mismo carácter. Para facilitar la compatibilidad con codificaciones anteriores, se proporcionan caracteres precompuestos; en la definición de dichos caracteres se hace constar qué caracteres intervienen en la composición.


== Ventajas y desventajas ==
Un grupo de caracteres consecutivos, independientemente de su tipo, forma una secuencia. En caso de que varias secuencias representen el mismo conjunto de caracteres esenciales, el estándar no define una de ellas como 'correcta', sino que las considera equivalentes. Para poder identificar dichas equivalencias, Unicode define los mecanismos de ''equivalencia canónica'' y de ''equivalencia de compatibilidad'' basados en la obtención de formas normalizadas de las cadenas a comparar.


==== Ventajas ====
=== Secuencias de descripción ideográfica ===
* UTF-8 permite codificar cualquier carácter Unicode.<ref name="UTF-8"></ref>
* Fácil identificación. Es posible identificar claramente una muestra de datos como UTF-8 mediante un sencillo algoritmo. La probabilidad de una identificación correcta aumenta con el tamaño de la muestra.<ref name="UTF-8"></ref>
* UTF-8 ahorrará espacio de almacenamiento para textos en caracteres latinos, donde los caracteres incluidos en US-ASCII son comunes, cuando se compara con otros formatos como UTF-16.<ref name="UNICODE"></ref>
* Una secuencia de bytes para un carácter jamás será parte de una secuencia más larga de otro carácter por contener información de sincronización.


==== Desventajas ====
Se admite que nunca se podrá finalizar la tarea de incluir ideogramas en el estándar debido, principalmente, a que la creación de nuevos ideogramas continúa. A fin de suplir eventuales carencias, Unicode ofrece un mecanismo que permite la representación de los símbolos que faltan denominado ''secuencias de descripción ideográfica''. Se basa en que la práctica totalidad de los ideogramas se puede descomponer en piezas más pequeñas que, a su vez, son ideogramas. Aunque sea posible la representación de un símbolo mediante una secuencia, el estándar especifica que siempre que exista una versión codificada su uso debe ser preferente. No hay un método para la ''descomposición canónica'' de ideogramas ni algoritmos de equivalencia por lo que las operaciones sobre el texto, como búsqueda u ordenación, pueden fallar.


* UTF-8 utiliza símbolos de longitud variable; eso significa que diferentes caracteres pueden codificarse con distinto número de bytes. Es necesario recorrer la cadena desde el inicio para encontrar el carácter que ocupa una determinada posición.
Unicode define 12 caracteres diferentes para la descripción de ideogramas representando distintas posibilidades de combinación espacial de otros caracteres Han.


* Los caracteres ideográficos usan 3 bytes en UTF-8, pero sólo 2 en UTF-16. Así, los textos chinos, japoneses o coreanos ocupan más espacio cuando se representan en UTF-8.<ref name="UNICODE">{{cita libro |autor= The Unicode Consortium |editor= Julie D. Allen, Joe Becker (et al.) |título= Unicode 5.0 standard |url=http://www.unicode.org/versions/Unicode5.0.0/bookmarks.html |fecha= [[octubre de 2006]] |año= [[2006]] |mes= [[octubre]] |editorial= Addisson-Wesley |idioma= Inglés |isbn= 0-321-48091-0}}</ref>
== Tratamiento de la información ==
=== Formas de codificación ===


* UTF-8 ofrece peor rendimiento que UTF-16 y UTF-32 en cuanto a carga computacional.<ref name="UNICODE"></ref>
Los puntos de código de Unicode se identifican por un número entero. Según su arquitectura, un ordenador utilizará unidades de 8, 16 o 32 bits para representar dichos enteros. Las ''formas de codificación'' de Unicode reglamentan la forma en que los puntos de código se transformarán en unidades tratables por el computador.


== Referencias ==
Unicode define tres formas de codificación bajo el nombre '''UTF''' o Formato de Transformación Unicode (''Unicode Transformation Format''):<ref name="UNICODE-UTF">{{cita libro |autor= The Unicode Consortium |editor= Julie D. Allen, Joe Becker (et al.) |título= Unicode 5.0 standard |url=http://www.unicode.org/versions/Unicode5.0.0/bookmarks.html
{{listaref}}
|capítulo=2.5 Encoding Forms|urlcapítulo=http://www.unicode.org/versions/Unicode5.0.0/ch02.pdf |fecha= [[octubre de 2006]] |año= [[2006]] |mes= [[octubre]] |editorial= Addisson-Wesley |idioma= Inglés |isbn= 0-321-48091-0}}</ref>
* [[UTF-8]] — codificación orientada a byte con símbolos de longitud variable.
* [[UTF-16]] — codificación de 16 bits de longitud variable optimizada para la representación del plano básico multilingüe (BMP).
* [[UTF-32]] — codificación de 32 bits de longitud fija, y la más sencilla de las tres.

Las ''formas de codificación'' se limitan a describir el modo en que se representan los puntos de código en formato inteligible por la máquina. A partir de las 3 formas identificadas se definen 7 esquemas de codificación.

=== Esquemas de codificación ===

Los ''esquemas de codificación'' tratan de la forma en que se serializa la información codificada.<ref name="UNICODE-UTF" /> La seguridad en los intercambios de información entre sistemas heterogéneos requiere la implementación de sistemas que permitan determinar el orden correcto de los bits y bytes y garantizar que la reconstrucción de la información es correcta. Una diferencia fundamental entre [[Unidad Central de Procesamiento|procesadores]] es el orden de disposición de los bytes en palabras de 16 y 32 bits, lo que se denomina ''[[endianness]]''. Los esquemas de codificación deben garantizar que los extremos de una comunicación saben cómo interpretar la información recibida. A partir de las 3 formas de codificación se definen 7 esquemas. A pesar de que comparten nombres, no debe confundirse esquemas y formas de codificación.

{| class="wikitable"
|-
| '''Esquema de codificación '''
| '''''[[Endianness]]'''''
| '''Admite BOM'''
|-
| UTF-8
| No aplicable
| Sí
|-
| UTF-16
| ''Big-endian'' o ''Little-endian''
| Sí
|-
| UTF-16BE
| ''Big-endian''
| No
|-
| UTF-16LE
| ''Little-endian''
| No
|-
| UTF-32
| ''Big-endian'' o ''Little-endian''
| Sí
|-
| UTF-32BE
| ''Big-endian''
| No
|-
| UTF-32LE
| ''Little-endian''
| No
|}

Unicode define una marca especial, ''Byte order mark'' o [[BOM]] al inicio de un fichero o una comunicación para hacer explícita la ordenación de bytes. Cuando un protocolo superior especifica el orden de bytes, la marca no es necesaria y puede omitirse dando lugar a los esquemas de la lista anterior con sufijo ''BE'' o ''LE''. En los esquemas UTF-16 y UTF-32, que admiten BOM, si este no se especifica se asume que la ordenación de bytes es [[endianness|''big-endian'']].

La unidad de codificación en UTF-8 es el byte por lo que no necesita una indicación de orden de byte. El estándar ni requiere ni recomienda la utilización de BOM, pero lo admite como marca de que el texto es Unicode o como resultado de la conversión de otros esquemas.

== Historia ==

El proyecto unicode se inició a finales de [[1987]], tras conversaciones entre los ingenieros de Apple y Xerox: Joe Becker, Lee Collins y Mark Davis.<ref name="UNICODE-HISTORY">{{cita web | título = Chronology of Unicode Version 1.0 | url= http://www.unicode.org/history/versionone.html}}</ref> Como resultado de su colaboración, en Agosto de [[1988]] se publicó el primer borrador de Unicode bajo el nombre de Unicode88.<ref name="UNICODE-DRAFT">
{{cita publicación | apellido = Becker | nombre = Joseph D. | fecha = [[10 de septiembre]] | año = [[1998]] | título = Unicode 88 | páginas = 10 | editorial = Unicode Consortium | url = http://www.unicode.org/history/unicode88.pdf | idioma = Inglés | fechaacceso = 29 de mayo de 2009}}</ref> Esta primera versión, con códigos de 16 bits, se publicó asumiendo que solo se codificarían los caracteres necesarios para el uso moderno.

Durante el año 1989 el trabajo continuó con la adición de colaboradores de otras compañías como [[Microsoft]] o [[Sun Microsystems]]. El Consorcio Unicode se formó el [[3 de febrero]] de [[1991]] y en octubre de 1991 se publicó la primera versión del estándar. La segunda versión, incluyendo escritura ideográfica Han se publicó en Junio de [[1992]]. A continuación se muestra una tabla con las distintas versiones del Estándar Unicode con sus adiciones o modificaciones más importantes.

{| class="wikitable"
|-
!rowspan=2| Version
!rowspan=2| Fecha
!rowspan=2| Publicación
!rowspan=2| Edición [[Universal Character Set|ISO/IEC 10646]] asociada
!rowspan=2| Escrituras
!colspan=2| Caracteres
|-
! #
! Adiciones notables
|-
| 1.0.0
| Octubre 1991
| ISBN 0-201-56788-1 (Vol.1)
|
| 24
| 7.161
| El repertorio inicial cubre los alfabetos: [[Alfabeto árabe|Árabe]], [[Alfabeto armenio|Armenio]], [[Alfabeto bengalí|Bengali]], [[Zhuyin|Bopomofo]], [[Alfabeto cirílico|Cirílico]], [[Alfabeto devanagari|Devanagari]], [[Alfabeto georgiano|Georgiano]], [[Alfabeto griego|Griego/Copto]], [[Idioma guyaratí|Gujarati]], [[Gurmukhi]], [[Hangul]], [[Alfabeto hebreo|Hebreo]], [[Hiragana]], [[Kannada]], [[Katakana]], [[Lao]], [[Alfabeto latino|Latino]], [[Malayalam]], [[Oriya]], [[Tamil]], [[Telugu]], [[Alfabeto tailandés|Thai]], y [[Idioma tibetano|Tibetano]].<ref name="UNICODE-CAMBIOS3"/>
|-
| 1.0.1
| Junio 1992
| ISBN 0-201-60845-6 (Vol.2)
|
| 25
| 28.359
| Definido el primer conjunto de 20.902 ideogramas [[CJK]] unificados.<ref name="UNICODE-CAMBIOS3"/>
|-
| 1.1
| Junio 1993
|
| ISO/IEC 10646-1:1993
| 24
| 34.233
| Se agregan 4.306 caracteres [[Hangul]] más al conjunto original de 2.350. Se elimina el alfabeto tibetano.<ref name="UNICODE-CAMBIOS3"/>
|-
| 2.0
| Julio 1996
| ISBN 0-201-48345-9
| ISO/IEC 10646-1:1993 con enmiendas 5, 6 y 7
| 25
| 38.950
| Eliminado el conjunto original de caracteres [[Hangul]]; se agrega un nuevo conjunto de 11.172 caracteres Hangul en una nueva ubicación. Se reincorpora el alfabeto tibetano en una nueva ubicación y con un juego de caracteres diferente. Se define el sistema de códigos subrogados y se crean los planos 15 y 16 de caracteres para uso privado.<ref name="UNICODE-CAMBIOS3"/>
|-
| 2.1
| Mayo 1998
|
| ISO/IEC 10646-1:1993 con enmiendas 5, 6 y 7, y dos caracteres de la enmienda 18
| 25
| 38.952
| Se agrega el símbolo del [[Euro]].<ref name="UNICODE-CAMBIOS3"/>
|-
| 3.0
| Septiembre 1999
| ISBN 0-201-61633-5
| ISO/IEC 10646-1:2000
| 38
| 49.259
| Ideogramas [[Cherokee]]. Escrituras [[Alfabeto etíope|Etíope]], [[Idioma camboyano|Jemer]], [[Idioma mongol|Mongol]], [[Idioma birmano|Myanmar]], [[Ogham]], [[Alfabeto rúnico]], [[Escritura Sinhala|Sinhala]], [[Alfabeto siríaco|Siríaco]], [[Thaana]], [[Silabarios indígenas canadienses|Silabario unificado de los indígenas canadienses]], y [[Yi]] además de los patrones [[Braille]].<ref name="UNICODE-CAMBIOS3">{{cita libro |autor= The Unicode Consortium, Joan Aliprand, et al. |título= The Unicode Standard. Version 3.0 standard|capítulo=Appendix D. Changes from Unicode Version 2.0 |url=http://unicode.org/book/appD.pdf |fecha= [[enero de 2000]] |año= [[2000]] |mes= [[enero]] |editorial= Addisson-Wesley |idioma= Inglés |isbn= 0-201-61633-5}}</ref>
|-
| 3.1
| Marzo 2001
|
| ISO/IEC 10646-1:2000
ISO/IEC 10646-2:2001
| 41
| 94,205
| Se agregan los alfabetos [[Alfabeto Deseret|Deseret]], [[Alfabeto gótico|Gótico]] y [[Alfabeto etrusco|Etrusco]], y los símbolos de [[Notación musical|Notación musical moderna]], [[Música bizantina]], y 42.711 ideogramas de [[CJK]] unificado.<ref name="UNICODE-CAMBIOS5"/>
|-
| 3.2
| Marzo 2002
|
| ISO/IEC 10646-1:2000 con la enmienda 1
ISO/IEC 10646-2:2001
| 45
| 95.221
| Agregadas las escrituras [[filipinas]]: [[Buhid]], [[Hanunó'o|Hanunoo]], [[Baybayin|Tagalo]], y [[Tagbanwa]].<ref name="UNICODE-CAMBIOS5"/>
|-
| 4.0
| Abril 2003
| ISBN 0-321-18578-1
| ISO/IEC 10646:2003
| 52
| 96.447
| Se agrega el [[Silabario chipriota]], [[Limbu]], [[Lineal B]], [[Alfabeto Osmanya|Osmanya]], [[Alfabeto Shaviano|Shaviano]], [[Idioma tai nüa|Tai Le]], y [[Alfabeto ugarítico|Ugarítico]], y los símbolos [[I Ching|Hexagrama]].<ref name="UNICODE-CAMBIOS5"/>
|-
| 4.1
| Marzo 2005
|
| ISO/IEC 10646:2003 con enmienda 1
| 59
| 97.720
| Agregados [[Idioma buginés|Buginese]], [[Alfabeto glagolítico|Glagolítico]], [[Kharoshthi]], [[New Tai Lue]], [[Persa antiguo]], [[Idioma sylheti|Syloti Nagri]], y [[Tifinagh]]. Se separa el [[Alfabeto copto|Copto]] del alfabeto griego. Símbolos griegos antiguos para música y numeración.<ref name="UNICODE-CAMBIOS5">{{cita libro |autor= The Unicode Consortium |editor= Julie D. Allen, Joe Becker (et al.) |título= Unicode 5.0 standard|capítulo=Appendix D. Changes from previous versions |url=http://www.unicode.org/versions/Unicode5.0.0/appD.pdf |fecha= [[octubre de 2006]] |año= [[2006]] |mes= [[octubre]] |editorial= Addisson-Wesley |idioma= Inglés |isbn= 0-321-48091-0}}</ref>
|-
| 5.0
| Julio 2006
| ISBN 0-321-48091-0
| ISO/IEC 10646:2003 con enmiendas 1 y 2 y cuatro caracteres de la enmienda 3
| 64
| 99.089
| Agregados [[Escrituras brahámicas|Balinés]], [[Cuneiforme]], [[Lenguas mandé|N'Ko]], [[Alfabeto de 'Phags-pa|Phags-pa]], y [[Alfabeto fenicio|Fenicio]].<ref name="UNICODE-CAMBIOS5"/>
|-
| 5.1
| Abril 2008
|
| ISO/IEC 10646:2003 más enmiendas 1, 2, 3 y 4
| 75
| 100.713
| Agregados [[Caria|escritura caria]], [[Lengua cham|Cham]], [[Kayah Li]], [[Lepcha|escritura lepcha]], [[Alfabeto licio]], [[Alfabeto Lidio]], [[Alfabeto Ol Chiki]], [[Escrituras brahámicas|Rejang]], [[Saurashtra]], [[Escrituras brahámicas|Sundanés]], y el [[Silabario Vai|Vai]]. Los jeroglíficos del [[Disco de Festos]], fichas de [[Mahjong]] y de [[Dominó]]. Adiciones importantes para el [[Escrituras brahámicas|Birmano]], letras y [[abreviaturas de amanuense]] utilizadas en [[manuscrito]]s medievales y la adición de la [[ß]] mayúscula.<ref>[http://www.unicode.org/Public/5.1.0/ucd/UnicodeData.txt Archivo de datos de Unicode 5.1]</ref>
|}

Unicode 5.2, en correspondencia con ISO/IEC 10646:2003 con enmiendas de 1 a 6, se publicará en otoño de 2009.<ref>[http://std.dkuug.dk/jtc1/sc2/wg2/docs/n3642.pdf Unicode Liaison Report&nbsp;— WG 2 meeting 54]</ref>


== Véase también ==
== Véase también ==
* [[Unicode|El estándar Unicode]]

* [[Sistema de escritura]]
* [[UTF-16]]
* [[UTF-32]]
* [[Historia de la escritura]]

== Referencias ==

{{listaref}}


== Enlaces externos ==
== Enlaces externos ==
* RFC 3629. Estándar UTF-8 (en inglés).
* [http://www.unicode.org/ Unicode Consortium]
* [http://www.cs.bell-labs.com/sys/doc/utf.pdf Hello World] Presentación de UTF-8 en ''USENIX winter 1993'' por Robert C. Pike y Kenneth L. Thompson (en inglés).
* [http://www.unicode.org/versions/Unicode5.0.0/appE.pdf Historia de la unificación Han]
* [http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt Diseño de UTF-8 comentado por Robert C. Pike] (en inglés).
* [http://www.unicode.org/charts/ Catalogo de sistemas de escritura y hojas de caracteres]

{{destacado|ru}}


[[Categoría:Codificación de caracteres]]
[[Categoría:Codificación de caracteres]]
[[Categoría:Normas ISO]]
[[Categoría:Unicode]]
[[Categoría:Protocolos y formatos de nivel de presentación]]
[[Categoría:Unicode| ]]


[[ar:صيغة التحويل الموحد-8]]
[[als:Unicode]]
[[ar:يونيكود]]
[[ca:UTF-8]]
[[az:Unicode]]
[[cs:UTF-8]]
[[bg:Уникод]]
[[da:UTF-8]]
[[de:UTF-8]]
[[bn:ইউনিকোড]]
[[br:Unicode]]
[[el:UTF-8]]
[[bs:Unikod]]
[[en:UTF-8]]
[[ca:Unicode]]
[[eo:UTF-8]]
[[chr:Unicode/Cherokee]]
[[fi:Unicode#UTF-8]]
[[ckb:یونیکۆد]]
[[fr:UTF-8]]
[[cs:Unicode]]
[[he:UTF-8]]
[[da:Unicode]]
[[hr:UTF-8]]
[[de:Unicode]]
[[hu:UTF-8]]
[[el:Unicode]]
[[it:UTF-8]]
[[en:Unicode]]
[[ja:UTF-8]]
[[eo:Unikodo]]
[[ko:UTF-8]]
[[et:Unicode]]
[[lt:UTF-8]]
[[eu:Unicode]]
[[lv:UTF-8]]
[[ml:യു.ടി.എഫ്-8]]
[[fa:یونی‌کد]]
[[fi:Unicode]]
[[nl:UTF-8]]
[[fr:Unicode]]
[[nn:UTF-8]]
[[ga:Unicode]]
[[no:UTF-8]]
[[gl:Unicode]]
[[pl:UTF-8]]
[[he:יוניקוד]]
[[pt:UTF-8]]
[[ru:UTF-8]]
[[hi:यूनिकोड]]
[[hr:Unicode]]
[[sk:UTF-8]]
[[hu:Unicode]]
[[sl:UTF-8]]
[[ia:Unicode]]
[[sr:UTF-8]]
[[id:Unicode]]
[[sv:UTF-8]]
[[is:Unicode]]
[[tr:UTF-8]]
[[it:Unicode]]
[[uk:UTF-8]]
[[ja:Unicode]]
[[zh:UTF-8]]
[[ka:უნიკოდი]]
[[kn:ಯುನಿಕೋಡ್]]
[[ko:유니코드]]
[[ks:यूनिकोड]]
[[ku:Unicode]]
[[ky:Юникод]]
[[lt:Unikodas]]
[[lv:Unikods]]
[[ml:യൂണികോഡ്]]
[[ms:Unicode]]
[[nds:Unicode]]
[[ne:युनिकोड]]
[[new:युनिकोड]]
[[nl:Unicode]]
[[nn:Unicode]]
[[no:Unicode]]
[[pl:Unicode]]
[[pt:Unicode]]
[[ro:Unicode]]
[[ru:Юникод]]
[[sh:Unikod]]
[[simple:Unicode]]
[[sk:Unicode]]
[[sl:Unicode]]
[[sq:Unicode]]
[[sr:Unikod]]
[[sv:Unicode]]
[[ta:ஒருங்குறி]]
[[tg:Юникод]]
[[th:ยูนิโคด]]
[[tr:Unicode]]
[[uk:Юнікод]]
[[ur:یکرمزی]]
[[vi:Unicode]]
[[wa:Unicôde]]
[[zh:Unicode]]
[[zh-min-nan:Thong-iōng-bé]]
[[zh-yue:統一碼]]

Revisión del 18:46 5 oct 2009

UTF-8 (8-bit Unicode Transformation Format) es un formato de codificación de caracteres Unicode e ISO 10646 utilizando símbolos de longitud variable. UTF-8 fue creado por Robert C. Pike y Kenneth L. Thompson. Está definido como estándar por la RFC 3629 de la Internet Engineering Task Force (IETF).[1]​ Actualmente es una de las tres posibilidades de codificación reconocidas por Unicode y lenguajes web, o cuatro en ISO 10646.

Sus características principales son:

  • Es capaz de representar cualquier carácter Unicode.
  • Usa símbolos de longitud variable (de 1 a 4 bytes por carácter Unicode).
  • Incluye la especificación US-ASCII de 7 bits, por lo que cualquier mensaje ASCII se representa sin cambios.
  • Incluye sincronía. Es posible determinar el inicio de cada símbolo sin reiniciar la lectura desde el principio de la comunicación.
  • No superposición. Los conjuntos de valores que puede tomar cada byte de un caracter multibyte, son disjuntos, por lo que no es posible confundirlos entre si.

Estas características lo hacen atractivo en la codificación de correos electrónicos y páginas web.[2]​ El IETF requiere que todos los protocolos de Internet indiquen qué codificación utilizan para los textos y que UTF-8 sea una de las codificaciones contempladas.[3]​ El Internet Mail Consortium (IMC) recomienda que todos los programas de correo electrónico sean capaces de crear y mostrar mensajes codificados utilizando UTF-8.[4]

Historia

UTF-8 fue ideado por Kenneth L. Thompson bajo los criterios de diseño de Robert C. Pike el 2 de septiembre de 1992. Ambos lo implementaron e implantaron en su sistema operativo Plan 9 from Bell Labs. Posteriormente fue oficialmente presentado en la conferencia USENIX en San Diego en Enero de 1993. Fue promovido a estándar con el patrocinio de X/Open Joint Internationalization Group (XOJIG) y durante el proceso recibió diferentes nombres como FSS/UTF y UTF-2.[1]

Descripción

UTF-8 divide los caracteres Unicode en varios grupos, en función del número de bytes necesarios para codificarlos. El número de bytes depende exclusivamente del código de carácter asignado por Unicode y del número de bytes necesario para representarlo. La distribución de caracteres es la siguiente:

  • Caracteres codificados con un byte: Los incluidos en US-ASCII, un total de 128 caracteres.
  • Caracteres codificados con dos bytes: Un total de 1920 caracteres. Este grupo incluye los caracteres latinos más signos diacríticos, y los alfabetos griego, cirílico, copto, armenio, hebreo, árabe, siríaco y Thaana entre otros.
  • Caracteres codificados con tres bytes: Caracteres del Plano básico multilingüe de Unicode, que unido al grupo anterior, incluye la práctica totalidad de caracteres de uso común, entre ellos los caracteres del grupo CJK: Chino, japonés y coreano.
  • Caracteres codificados con cuatro bytes: Caracteres del plano suplementario multilingüe. Símbolos matemáticos y alfabetos clásicos para uso principalmente académico: Lineal B silábico e ideográfico, alfabeto persa, fenicio... Y el plano suplementario ideográfico: caracteres Han de uso poco común.

Una propiedad importante de la codificación es que los bits más significativos del primer byte de una secuencia multi-byte determinan la longitud de la secuencia. Estos bits más significativos 110 para secuencias de dos bytes; 1110 para secuencias de tres bytes, etc. Estos bits además proporcionan la información de sincronía que permite identificar el inicio de un símbolo.

La tabla siguiente muestra la forma en que se codifican los caracteres. Los valores fijos al principio de cada byte garantizan el cumplimento del principio de no superposición, pues son distintos en función de la posición del byte en la cadena.

Rango de Código
UNICODE
hexadecimal
UTF-16 UTF-8 Notas
000000 - 00007F 00000000 0xxxxxxx 0xxxxxxx Rango equivalente a US-ASCII. Símbolos de un único byte donde el bit más significativo es 0
000080 - 0007FF 00000xxx xxxxxxxx 110xxxxx 10xxxxxx Símbolos de dos bytes. El primer byte comienza con 110, el segundo byte comienza con 10
000800 - 00FFFF xxxxxxxx xxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx Símbolos de tres bytes. El primer byte comienza con 1110, los bytes siguientes comienzan con 10
010000 - 10FFFF 110110xx xxxxxxxx
110111xx xxxxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx Símbolos de cuatro bytes. El primer byte comienza con 11110, los bytes siguientes comienzan con 10

Siguiendo el esquema anterior, sería posible incrementar el tamaño máximo del símbolo de 4 a 6 bytes. La definición de UTF-8 dada por Unicode no admite esta posibilidad que sí es admitida por ISO/IEC.[5]

Veamos, a modo de ejemplo, cómo se codifica en UTF-8 el carácter eñe ('ñ'), que se representa en Unicode como 0x00F1:

  • Su valor se sitúa en el rango de 0x0080 a 0x07FF. Una consulta a la tabla permite ver que debe ser codificado usando 2 bytes, con el formato 110xxxxx 10xxxxxx.
  • El valor hexadecimal 0x00F1 es equivalente al binario (0000-0)000-1111-0001 (los primeros 5 bits se ignoran, ya que no son necesarios para representar valores en el rango especificado).
  • Los 11 bits requeridos se sitúan ordenados en la posición marcada por las equis: 11000011 10110001.
  • El resultado final son dos bytes con los valores hexadecimales 0xC3 0xB1. Ese es el código de la letra eñe en UTF-8.

Para recuperar el punto de código original se realiza el proceso inverso, descomponiendo las secuencias de bits en sus componentes y tomando solo los bits necesarios.

Errores de codificación

Las normas de codificación establecen, por lo tanto, límites a las cadenas que se pueden formar. Según la norma, un intérprete de cadenas debe rechazar como inválidos, y no tratar de interpretar, las caracteres mal formados. Un intérprete de cadenas UTF-8 puede cancelar el proceso señalando un error, omitir los caracteres mal formados o reemplazarlos por un caracter U+FFFD (REPLACEMENT CHARACTER).

Los siguientes son errores de codificación:

  • Secuencias truncadas, cuando un carácter de inicio multi-byte no está seguido por suficientes bytes.
  • Bytes de datos (comenzados por 10) sin el correspondiente inicio de carácter.
  • Caracteres anómalamente largos: Por ejemplo, representar con 2 bytes un carácter del rango ASCII de un byte. Los bytes 0xC0, 0xC1 no se admiten.
  • Bytes de inicio de carácter que especifican un largo anómalo de 5 o 6 bytes. Los bytes 0xF8 a 0xFD no se admiten.
  • Caracteres fuera del rango Unicode: Los bytes 0xF5 y 0xF7 no se admiten.
  • Caracteres inválidos. Los caracteres en el rango de pares subrogados de UTF-16, con código de 0xD800 a 0xDFFF, no son caracteres reales y no deben codificarse en UTF-8.

Byte order mark (BOM)

Cuando se sitúa al inicio de una cadena UTF-8, un carácter 0xFEFF, codificado en UTF-8 como 0xEF,0xBB,0xBF, se denomina Byte Order Mark (BOM) e identifica el contenido como una cadena de caracteres Unicode. Cuando este carácter se encuentra en otro lugar de la cadena debe ser interpretado con su significado original Unicode (ZWNBSP). Al ser UTF-8 una codificación en la que la unidad de información es el byte, no tiene la utilidad que sí tiene en UTF-16 y UTF-32 de identificar el orden de bytes en una palabra (endianness).

La especificación no recomienda o desaconseja la utilización de BOM, aunque sí desaconseja eliminarlo si existe como medida de seguridad, previendo errores en aplicaciones de firma digital, etc. También advierte que debe ser eliminado en operaciones de concatenación para impedir que se mantenga en posiciones no iniciales.

Derivaciones de UTF-8

Las siguientes normas de codificación presentan diferencias con la especificación UTF-8 y son, por lo tanto, incompatibles con ella.

CESU-8

Esta implementación realiza una traducción directa de la cadena de caracteres representada con UTF-16 en lugar de codificar los puntos de código Unicode. El resultado es codificaciones diferentes para caracteres Unicode con código superior a 0xFFFF.[1]Oracle, a partir de la versión 8, implementa CESU-8 con el alias UTF8 y, a partir de la versión 9, UTF-8 estándar con otro alias.[6]​ Java y Tcl utilizan esta codificación.[cita requerida]

UTF-8 modificado

Con UTF-8 modificado, el carácter nulo se codifica como 0xC080 en lugar de 0x00. De esta forma un texto que contenga el carácter nulo no contendrá el byte 0x00 y, por lo tanto, no se truncará en lenguajes como C que consideran 0x00 un final de cadena.

Todas las implementaciones conocidas de UTF-8 modificado cumplen, además, con CESU-8[cita requerida].

Ventajas y desventajas

Ventajas

  • UTF-8 permite codificar cualquier carácter Unicode.[1]
  • Fácil identificación. Es posible identificar claramente una muestra de datos como UTF-8 mediante un sencillo algoritmo. La probabilidad de una identificación correcta aumenta con el tamaño de la muestra.[1]
  • UTF-8 ahorrará espacio de almacenamiento para textos en caracteres latinos, donde los caracteres incluidos en US-ASCII son comunes, cuando se compara con otros formatos como UTF-16.[7]
  • Una secuencia de bytes para un carácter jamás será parte de una secuencia más larga de otro carácter por contener información de sincronización.

Desventajas

  • UTF-8 utiliza símbolos de longitud variable; eso significa que diferentes caracteres pueden codificarse con distinto número de bytes. Es necesario recorrer la cadena desde el inicio para encontrar el carácter que ocupa una determinada posición.
  • Los caracteres ideográficos usan 3 bytes en UTF-8, pero sólo 2 en UTF-16. Así, los textos chinos, japoneses o coreanos ocupan más espacio cuando se representan en UTF-8.[7]
  • UTF-8 ofrece peor rendimiento que UTF-16 y UTF-32 en cuanto a carga computacional.[7]

Referencias

  1. a b c d e F. Yergeau (Noviembre 2003). «RFC 3629 - UTF-8, un formato de transformación de ISO 10646». Internet Society. Consultado el 20 de mayo de 2009. 
  2. «Moving to Unicode 5.1». Official Google Blog. 5 de mayo de 2008. Consultado el 20 de mayo de 2009. 
  3. H. Alvestrand (Enero 1998). «RFC 2277 - Política oficial de IETF sobre juegos de caracteres e idiomas». Internet Engineering Task Force. Consultado el 20 de mayo de 2009. 
  4. «Utilización de Caracteres Internacionales en el Correo de Internet». Internet Mail Consortium. 1 de agosto de 1998. Consultado el 20 de mayo de 2008. 
  5. The Unicode Consortium (octubre de 2006). «2.5 Encoding Forms». En Julie D. Allen, Joe Becker (et al.), ed. Unicode 5.0 standard (en inglés). Addisson-Wesley. ISBN 0-321-48091-0. 
  6. Simon Law (Mayo de 2005). «Globalization Support. Oracle Unicode database support.». Oracle Corporation. Consultado el 20 de mayo de 2009. 
  7. a b c The Unicode Consortium (octubre de 2006). Julie D. Allen, Joe Becker (et al.), ed. Unicode 5.0 standard (en inglés). Addisson-Wesley. ISBN 0-321-48091-0. 

Véase también

Enlaces externos