Cuando pongo 'a' en un archivo de texto, tiene 2 bytes, pero cuando pongo, digamos 'ա', que es una letra del alfabeto armenio, tiene 3 bytes.
¿Cuál es la diferencia entre alfabetos para una computadora?
¿Por qué el inglés ocupa menos espacio?
Cuando pongo 'a' en un archivo de texto, tiene 2 bytes, pero cuando pongo, digamos 'ա', que es una letra del alfabeto armenio, tiene 3 bytes.
¿Cuál es la diferencia entre alfabetos para una computadora?
¿Por qué el inglés ocupa menos espacio?
Respuestas:
Uno de los primeros esquemas de codificación que se desarrollará para usar en computadoras convencionales es el estándar ASCII ( American Standard Code for Information Interchange ). Fue desarrollado en la década de 1960 en los Estados Unidos.
El alfabeto inglés usa parte del alfabeto latino (por ejemplo, hay pocas palabras acentuadas en inglés). Hay 26 letras individuales en ese alfabeto, sin considerar el caso. Y también tendría que existir los números individuales y los signos de puntuación en cualquier esquema que pretenda codificar el alfabeto inglés.
La década de 1960 también fue una época en que las computadoras no tenían la cantidad de memoria o espacio en disco que tenemos ahora. ASCII fue desarrollado para ser una representación estándar de un alfabeto funcional en todas las computadoras estadounidenses. En ese momento, la decisión de hacer que cada carácter ASCII tuviera 8 bits (1 byte) de largo se tomó debido a los detalles técnicos de la época (el artículo de Wikipedia menciona el hecho de que la cinta perforada contenía 8 bits en una posición a la vez). De hecho, el esquema ASCII original puede transmitirse usando 7 bits, los ocho podrían usarse para verificaciones de paridad. Desarrollos posteriores ampliaron el esquema ASCII original para incluir varios caracteres acentuados, matemáticos y terminales.
Con el reciente aumento del uso de computadoras en todo el mundo, más y más personas de diferentes idiomas tuvieron acceso a una computadora. Eso significaba que, para cada idioma, se tenían que desarrollar nuevos esquemas de codificación, independientemente de otros esquemas, que entrarían en conflicto si se leían desde diferentes terminales de idiomas.
Unicode surgió como una solución a la existencia de diferentes terminales, fusionando todos los posibles caracteres significativos en un único conjunto de caracteres abstractos.
UTF-8 es una forma de codificar el juego de caracteres Unicode. Es una codificación de ancho variable (por ejemplo, diferentes caracteres pueden tener diferentes tamaños) y fue diseñada para ser compatible con versiones anteriores del esquema ASCII anterior. Como tal, el conjunto de caracteres ASCII seguirá siendo un byte grande, mientras que cualquier otro carácter tendrá dos o más bytes. UTF-16 es otra forma de codificar el juego de caracteres Unicode. En comparación con UTF-8, los caracteres se codifican como un conjunto de una o dos unidades de código de 16 bits.
Como se indicó en los comentarios, el carácter 'a' ocupa un solo byte mientras que 'ա' ocupa dos bytes, lo que denota una codificación UTF-8. El byte adicional en su pregunta se debió a la existencia de un carácter de nueva línea al final (que el OP descubrió).
echo 'ա' > file.txt
, o editas el archivo usando algunos editores, automáticamente agregan una nueva línea después de él. Si ejecuta xxd file.txt
, el último byte probablemente sea un 0a
, o avance de línea.
a
, usará dos bytes (o un múltiplo de dos).
1 byte es de 8 bits y, por lo tanto, puede representar hasta 256 (2 ^ 8) valores diferentes.
Para los idiomas que requieren más posibilidades que esto, no se puede mantener una asignación simple 1 a 1, por lo que se necesitan más datos para almacenar un carácter.
Tenga en cuenta que, en general, la mayoría de las codificaciones utilizan los primeros 7 bits (128 valores) para los caracteres ASCII . Eso deja el octavo bit, o 128 valores más para más caracteres. . . agregue caracteres acentuados, idiomas asiáticos, cirílico, etc., y podrá ver fácilmente por qué 1 byte no es suficiente para mantener todos los caracteres.
En UTF-8, los caracteres ASCII usan un byte, otros caracteres usan dos, tres o cuatro bytes.
La cantidad de bytes necesarios para un carácter (de lo que aparentemente se trata la pregunta) depende de la codificación de caracteres. Si usa la codificación ArmSCII, cada letra armenia ocupa solo un byte. Sin embargo, no es una buena opción en estos días.
En la codificación de transferencia UTF-8 para Unicode, los caracteres necesitan un número diferente de bytes. En él, "a" toma solo un byte (la idea de dos bytes es una especie de confusión), "á" toma dos bytes y la letra armenia ayb "ա" también toma dos bytes. Tres bytes deben ser una especie de confusión. En contraste, por ejemplo, la letra bengalí a “অ” toma tres bytes en UTF-8.
El trasfondo es simplemente que UTF-8 fue diseñado para ser muy eficiente para los caracteres Ascii, bastante eficiente para los sistemas de escritura en Europa y sus alrededores, y todo lo demás es menos eficiente. Esto significa que las letras latinas básicas (que es en lo que consiste principalmente el texto en inglés), solo se necesita un byte para un carácter; para griego, cirílico, armenio y algunos otros, se necesitan dos bytes; todo lo demás necesita más.
UTF-8 tiene (como se señala en un comentario) también la propiedad útil de que los datos Ascii (cuando se representan como unidades de 8 bits, que ha sido casi la única forma durante mucho tiempo) también están trivialmente codificados en UTF-8.
Los códigos de caracteres en la década de 1960 (y mucho más allá) eran específicos de la máquina. En la década de 1980 utilicé brevemente una máquina DEC 2020, que tenía palabras de 36 bits y codificaciones de 5, 6 y 8 bits ( IIRC ) por carácter. Antes de eso, usé una serie IBM 370 con EBCDIC. ASCII con 7 bits ordenó, pero se confundió con las "páginas de códigos" de IBM PC que usaban los 8 bits para representar caracteres adicionales, como todo tipo de dibujos de cuadros para pintar menús primitivos, y luego extensiones ASCII como Latin-1 (8 bits codificaciones, con los primeros 7 bits como ASCII y la otra mitad para los "caracteres nacionales", como ñ
, Ç
u otros. Probablemente el más popular fue América-1, adaptado a la mayoría de las lenguas europeas Inglés y el uso de caracteres latinos (y acentos y variantes).
Escribir texto mezclando, por ejemplo, inglés y español funcionó bien (solo use latín-1, superconjunto de ambos), pero mezclar cualquier cosa que usara codificaciones diferentes (por ejemplo, incluir un fragmento de griego o ruso, sin mencionar un idioma asiático como el japonés) Una verdadera pesadilla. Lo peor fue que los rusos y particularmente los japoneses y chinos tenían varias codificaciones populares, completamente incompatibles.
Hoy usamos Unicode, que se combina con codificaciones eficientes como UTF-8 que favorecen los caracteres en inglés (sorprendentemente, la codificación de letras en inglés solo corresponde a ASCII), lo que hace que muchos caracteres no ingleses usen codificaciones más largas.
Windows 8.1 US / English File con una sola 'a' guardada con el bloc de notas.
Archivo con un solo 'ա' guardado con el bloc de notas
Una sola 'a' está codificada como un solo byte en ANSI, en Unicode cada carácter suele ser de 2 bytes, también hay una BOM de 2 bytes (Marcador de orden de bytes) al comienzo del archivo. UTF-8 tiene una lista de materiales de 3 bytes y el carácter de un solo byte.
Para la 'ա', ese carácter no existe en el juego de caracteres ANSI y no se puede guardar en mi máquina. El archivo Unicode es el mismo que antes, y el archivo UTF-8 es 1 byte más grande ya que el carácter toma 2 bytes.
Si su máquina es de una región diferente, es posible que tenga instalada una página de códigos OEM diferente que tiene diferentes glifos para los 255 caracteres posibles en el rango ASCII. Como @ntoskrnl mencionó, la página de códigos OEM para mi máquina sería Windows-1252, que es el valor predeterminado para inglés de EE. UU.
Si está interesado en cómo se almacenan los caracteres, puede ir a www.unicode.org y mirar a su alrededor. En la parte superior de su página principal hay un enlace "Gráficos de códigos" que muestra todos los códigos de caracteres que están disponibles en Unicode.
Con todo, hay un poco más de un millón de códigos disponibles en Unicode (no se usan todos). Un byte puede contener 256 valores diferentes, por lo que necesitaría tres bytes si desea almacenar todos los códigos Unicode posibles.
En cambio, Unicode generalmente se almacena en la codificación "UTF-8" que usa menos bytes para algunos caracteres y más para otros. Los primeros 128 valores de código se almacenan en un solo byte, hasta los primeros 2048 valores de código se almacenan en dos bytes, hasta 65536 se almacenan en tres bytes y el resto ocupa cuatro bytes. Esto se ha organizado para que los valores de código que se usan con más frecuencia ocupen menos espacio. AZ, az, 0-9 y! @ $% ^ & * () - [} {}; ': "|,. / <>? Y algunos que olvidé toman un byte; casi todo inglés, 98% de El alemán y el francés (solo adivinando) se pueden almacenar en un byte por carácter, y estos son los caracteres que más se utilizan. Cirílico, griego, hebreo, árabe y algunos otros usan dos bytes por carácter. Idiomas indios, la mayoría de chino, japonés , Coreano, tailandés, toneladas de símbolos matemáticos, Se puede escribir en tres bytes por carácter. Las cosas raras (si alguna vez quieres escribir texto en Lineal A o Linear B, Emojis) toman cuatro bytes.
Otra codificación es UTF-16. Todo lo que toma 1, 2 o 3 bytes en UTF-8 toma dos bytes en UTF-16. Esa es una ventaja si tiene texto en chino o japonés con muy pocos caracteres latinos en el medio.
Acerca de los motivos del diseño UTF-8: tiene varias ventajas sobre otros diseños. Son:
Compatibilidad con caracteres ASCII de EE. UU.
Compactabilidad razonable
Sincronización automática: esto significa que si se le da parte de una secuencia de bytes que son caracteres en la codificación UTF-8, puede averiguar dónde comienza el carácter. En algunas codificaciones, tanto xy como yx pueden ser codificaciones válidas de caracteres, por lo que si se le da parte de una secuencia ... xyxyxyxyxyxy ... no puede saber qué caracteres tiene.
Corrección de la clasificación: si clasifica las cadenas que contienen caracteres codificados UTF-8 por sus valores de byte, se ordenan automáticamente de acuerdo con sus valores Unicode.
Compatible con código de un solo byte: la mayoría de los códigos que asumen valores de un solo byte funcionan automáticamente correctamente con caracteres codificados UTF-8.
Además de las razones que olvide.