Este equipo redactor ha pasado mucho tiempo buscando para darle solución a tu búsqueda, te dejamos la solución y deseamos que sea de mucha apoyo.
Solución:
POSIXly, el énfasis es mío:
3.87 Carácter
Una secuencia de uno o más bytes que representa un solo símbolo gráfico o código de control.
En la práctica, el significado exacto depende de la configuración regional vigente, por ejemplo, bajo la configuración regional “C”, printf 'xc3xa4xc3xb6' |wc -m
da 4, ya que efectivamente cuenta bytes; mientras se encuentra en una configuración regional UTF-8 que da 2, ya que son los dos caracteres codificados en UTF-8 äö
. Suponiendo que su terminal también esté configurado en UTF-8, por supuesto, podría simplemente escribir printf 'äö'
.
(Tenga en cuenta que wc -c
está definido para contar bytes, no caracteres, de manera bastante confusa).
Peor aún, el soporte de caracteres también depende de la utilidad, y no todo trata con caracteres de varios bytes de forma limpia (y mucho menos todas las peculiaridades de Unicode). Por ejemplo, GNU tr trata con bytes, independientemente de lo que diga su página de manual:
$ printf ä | tr ä xy; echo
xx
$ printf ö | tr ä xy; echo
x
El primero es el mismo que tr '303244' 'xy'
, entonces ambos bytes de ä
ser reemplazado, y ese segundo sucede porque el primer byte de ambos ä
y ö
es el mismo. Por supuesto, si realmente se trata de personajes, estos deberían imprimir x
y ö
.
Un byte es por convención y la definición POSIX de ocho bits. Un bit es un dígito binario (es decir, el fundamental 1
o 0
que está en la base de casi toda la informática digital).
Un personaje es a menudo un byte y en algunos contextos (por ejemplo, ASCII) se puede definir para tener una longitud de un byte. Sin embargo, Unicode y UTF-8 y UTF-16 definen conjuntos de caracteres expandidos en los que un solo carácter (o glifo) puede definirse mediante cargas útiles de datos de más de un byte de longitud.
El personaje único:
Q̴̢̪̘̳̣̞̩̪̑̍̉̆̉͛̑̂̕͝
es un solo carácter, pero está compuesto en Unicode aplicando múltiples acentos (o diacríticos) al glifo base, el simple Q
. Esta codificación tiene una longitud de muchos más bytes que uno: poner únicamente ese carácter en un archivo y mostrar el contenido con hexdump
en vez de cat
en mi configuración regional produce:
$ hexdump -C demo
00000000 51 cc b4 cc 91 cc 8d cc 89 cc 86 cc 89 cd 9d cd |Q...............|
00000010 9b cc 91 cc 95 cc 82 cc aa cc 98 cc b3 cc a3 cc |................|
00000020 a2 cc 9e cc a9 cc aa 0a |........|
00000028
A byte es el elemento básico, generalmente de 8 bits de longitud (también llamado octeto), aunque ha habido (y probablemente todavía hay) otros tamaños. Con un byte de 8 bits, puede codificar 256 valores diferentes (de 0 a 255).
Para los personajes, las cosas varían según la codificación y el juego de caracteres utilizados.
-
El conjunto de caracteres / codificación más simple y común es ASCII. Cada personaje usa un byte (en realidad menos, solo 7 bits). Incluye letras minúsculas y mayúsculas del alfabeto inglés sin signos diacríticos (acentos y similares), dígitos, puntuación común y caracteres de control.
-
Luego tenemos una serie de conjuntos de caracteres de 8 bits, como la serie ISO-8859, páginas de códigos de MS-DOS y Windows, conjuntos de caracteres de Mac, etc.
Esos son superconjuntos de ASCII (los primeros 128 valores son los mismos que ASCII), con los otros 128 valores utilizados para caracteres específicos de la configuración regional (caracteres acentuados, alfabetos alternativos como griego o cirílico …).
Esto causó todo tipo de dolores de cabeza al transferir archivos entre computadoras e incluso entre programas, ya que no todos usaban el mismo juego de caracteres.
En ese caso, un personaje todavía estaba un byte.
-
Luego vino la familia Unicode, que intentó unificar todo en un solo conjunto, que obviamente era más grande que 256, por lo que no cabía en un solo byte.
-
Al principio, se pensó que 16 bits serían suficientes, y se ideó UCS-2, utilizando 2 bytes por carácter (lo que significaría un máximo de 65536 caracteres posibles, aunque no todos fueron asignados, lo que permitió UTF-16).
-
Luego quedó claro que 2 bytes no siempre serían suficientes, por lo que se introdujo UTF-16, que usa pares sustitutos para codificar caracteres adicionales. Para los personajes en el BMP (plano multilingüe básico), todavía usan 2 bytes exactamente, pero para los caracteres “extra”, utilizan 2 unidades de código de 2 bytes cada una, para un total de 4 bytes.
UTF-16 es la codificación nativa de Windows NT y sus sucesores. Sin embargo, incluso UTF-16 tuvo problemas, ya que no todos estuvieron de acuerdo en el orden de los dos bytes: little-endian o big-endian, por lo que tenemos UTF-16LE y UTF-16BE. Con o sin BOM.
-
También hay UCS-4 y UTF-32 que utilizan 4 bytes por carácter (UTF-32 está limitado a los valores que se pueden expresar como UTF-16), pero son bastante raros.
-
UTF-8 es una codificación de longitud variable que probablemente se esté convirtiendo en la codificación más común. Un carácter se puede codificar como en cualquier lugar entre 1 y 4 bytes.
La genialidad de UTF-8 es que la parte ASCII de Unicode (puntos de código 0 a 127) todavía está codificada como un solo byte, y se garantiza que los puntos de código más allá de eso nunca incluirán bytes entre 0 y 127. Esto permite un cierto nivel de compatibilidad con software donde caracteres específicos tienen un significado especial, incluyendo
/
(oo
:
) para rutas, mucha puntuación (!=+-*/^"'<>[]
etc.) para lenguajes de programación y shells, caracteres de control como CR, LF o tab, espacios, etc.
Pero en Unicode, hay una complejidad adicional: los puntos de código se pueden componer. Puedes codificar é
como un solo personaje é
(U + 00E9 LETRA E MINÚSCULA LATINA CON AGUDO), o como e
(U + 0065 LETRA E MINÚSCULA LATINA) seguido de ◌́
(U + 0301 COMBINANDO ACENTO AGUDO). Como se muestra en la respuesta de DopeGhoti, ¡puedes apilar bastantes marcas de combinación en una sola letra!
Los diacríticos no son los únicos puntos de código que combinan. Hay muchos que se utilizan para hacer variaciones, especialmente para emoji. Puedes cambiar su color de piel (), su género (), su edad (), combinarlos para formar una familia: … El último es 5 puntos de código y toma 18 bytes!
Te mostramos reseñas y calificaciones
Tienes la opción de añadir valor a nuestra información contribuyendo tu experiencia en las crónicas.