Story Transcript
Teclado Tabla de Contenido Teclado ................................................................................................................................... 2 Funcionamiento .................................................................................................................. 3 Clasificación de teclados .................................................................................................... 3 Representación de Caracteres ................................................................................................. 4 Algunas definiciones .......................................................................................................... 4 Los caracteres de control ASCII ..................................................................................... 5 Caracteres imprimibles ASCII........................................................................................ 6 Algunas Propiedades Especiales .................................................................................... 6 UNICODE .......................................................................................................................... 7 Almacenamiento en memoria: ............................................................................................ 8 Ejercicios: ......................................................................................................................... 10 Solucionario Ejercicios: .................................................................................................... 12
Las siguientes notas son generadas a partir de adaptaciones, traducciones y copias textuales de diferentes sitios de Internet. http://en.wikipedia.org http://es.wikipedia.org http://www.juque.cl/weblog/2006/01/25/ascii-unicode-utf8-y-la-iatarnaaianalizaaian-partei.html http://www.howstuffworks.com
Teclado Un teclado de computador es un periférico utilizado para la introducción de órdenes y datos en un computador. Existen distintas disposiciones de teclado, para que se puedan utilizar en diversos lenguajes. El tipo estándar de teclado inglés se conoce como QWERTY, siglas corresponden a las primeras letras del teclado, comenzando por la izquierda en la fila superior. El teclado en español o su variante latinoamericana son teclados QWERTY que se diferencian del inglés por presentar la letra "ñ" y "Ñ" en su distribución de teclas. Existen otras distribuciones de teclado como la AZERTY común en los países de habla francesa. Se han sugerido distintas alternativas a la disposición de teclado, indicando ventajas tales como mayores velocidades de tecleado. La alternativa más famosa es el Teclado Simplificado Dvorak.
Teclado AZERTY
Teclado Dvorak
Funcionamiento Un teclado está basado en un microcontrolador, normalmente de las familias 8048 u 8051 de Intel. Estos microcontroladores ejecutan sus propios programas que están grabados en sus respectivas ROMs internas. Estos programas realizan la exploración matricial de las teclas para determinar cuales están pulsadas. Para lograr un sistema flexible los microcontroladores no identifican cada tecla con su carácter serigrafiado en la misma, sino que se adjudica un valor numérico (Scan code) a cada una de ellas que sólo tiene que ver con su posición física e identifica de manera única a cada tecla. Si no se hiciera así ese sistema sería muy dependiente de cada idioma, también hay que tener en cuenta que idiomas como por ejemplo en francés tienen teclados AZERTY en lugar del que se tiene en Estados Unidos QWERTY. Los teclados usados en América latina y España extienden la configuración básica del teclado QWERTY con el fin de incluir la letra eñe y facilidades para letras acentuadas. Como el teclado español debe servir para las diversas lenguas de la península ibérica se facilita sobre todo la escritura de diversos acentos aún los no utilizados en el castellano. El teclado latinoamericano sólo da soporte con teclas directas a los caracteres específicos del castellano, que incluyen dos tipos de acento, la letra eñe y los inicios de exclamación e interrogación. El resto de combinaciones de acentos se obtienen usando una técla de extensión de grafismos (). Por lo demás el teclado latinoamericano está orientado hacia la programación, con fácil acceso al juego de símbolos de la norma ASCII. Por cada pulsación o liberación de una tecla el microcontrolador envía el Scan Code al sistema. Para permitir que varias teclas sean pulsadas simultáneamente, el teclado genera un código diferente cuando una tecla se pulsa y cuando dicha tecla se libera. Si el microcontrolador nota que ha cesado la pulsación de la tecla, el nuevo código generado (Break Code) tendrá un valor de pulsación incrementado en 128. Una vez identificado el scan code de la tecla presionada, se identifica el carácter que representa buscando en una tabla de conversión que maneja el sistema. Cuando se configura en Windows la configuración de idioma y teclado, lo que en últimas se está haciendo es definir la tabla de conversión entre el scan code y el código que se emplea internamente para su representación (ver la representación de caracteres en la siguiente sección).
Clasificación de teclados En el mercado hay una gran variedad de teclados. -Teclado XT de 83 teclas: Se usaba en el PC XT (8086/88). -Teclado AT de 83 teclas: Usado con los PC AT (286/386). -Teclado expandido de 101/102 teclas: Es el teclado actual, con un mayor número de teclas.
-Tipo ergonómico: Diseñados para dar una mayor comodidad para el usuario, ayudándole a tener una posición más relajada de los brazos. -Teclado multimedia: Añade teclas especiales que llaman a algunos programas en el computador, a modo de acceso directo, como pueden ser el programa de correo electrónico, la calculadora, el reproductor multimedia… -Teclado inalámbrico. Suelen ser teclados comunes donde la comunicación entre el computador y el periférico se realiza a través de rayos infrarrojos, ondas de radio o mediante bluetooth.
Representación de Caracteres Algunas definiciones Un caracter es el componente más pequeño de un lenguaje escrito y además posee un valor semántico. Ejemplos de caracter: “1”, “.”, “A” “纯”. Un conjunto de caracteres es un grupo de caracteres sin ningún valor numérico asociado. Ejemplos de conjunto de caracteres puede ser el alfabeto Español o el Cirílico (usado en Rusia y Bulgaria). Un conjunto de caracteres codificados es un grupo de caracteres asociados a un valor escalar. Ejemplo la letra “A” mayúscula, que según la tabla ASCII tiene el valor 65. Todo el mundo sabrá que un computador funciona en base a cambios eléctricos: prendido y apagado, sí y no; un estado binario que es representado con 1's y 0's respectivamente, absolutamente todo es representado en ceros y unos dentro de estas maquinitas: un mp3, una fotografía digital, un texto, etcétera. Quedemos con el texto por un momento; cuando escribimos uno igualmente queda almacenado en el computador como una hilera de 0's y 1's. Supongamos que escribimos un texto con la palabra: Hola, su representación binaria sería: Binario Caracter -----------------1001000 | H 1101111 | o 1101100 | l 1100001 | a El código ASCII (acrónimo inglés de American Standard Code for Information Interchange Información), pronunciado generalmente [áski], es un código de caracteres basado en el alfabeto latino tal como se usa en inglés moderno y en otras lenguas occidentales. Fue creado en 1963 por el Comité Estadounidense de Estándares (ASA, conocido desde 1969 como el Instituto Estadounidense de Estándares Nacionales, o ANSI) como una evolución de los conjuntos de códigos utilizados entonces en telegrafía. Más tarde, en 1967, se
incluyeron las minúsculas, y se redefinieron algunos códigos de control para formar el código conocido como US-ASCII. El código ASCII utiliza 7 bits para representar los caracteres, aunque inicialmente empleaba un bit adicional (bit de paridad) que se usaba para detectar errores en la transmisión. A menudo se llama incorrectamente ASCII a otros códigos de caracteres de 8 bits, como el estándar ISO-8859-1 que es una extensión que utiliza 8 bits para proporcionar caracteres adicionales usados en idiomas distintos al inglés, como el español. ASCII fue publicado como estándar por primera vez en 1967 y fue actualizado por última vez en 1986. En la actualidad define códigos para 33 caracteres no imprimibles, de los cuales la mayoría son caracteres de control obsoletos que tienen efecto sobre como se procesa el texto, más otros 95 caracteres imprimibles que les siguen en la numeración (empezando por el carácter espacio). Casi todos los sistemas informáticos actuales utilizan el código ASCII o una extensión compatible para representar textos y para el control de dispositivos que manejan texto. Tabla US-ASCII * | 0 1 2 3 4 5 6 7 8 9 A B C D E F -------------------------------------------------------------0 | NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI 1 | DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 2 | (1) ! " # $ % & ' ( ) * + , - . / 3 | 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4 | @ A B C D E F G H I J K L M N O 5 | P Q R S T U V W X Y Z [ \ ] ^ _ 6 | ` a b c d e f g h i j k l m n o 7 | p q r s t u v w x y z { | } ~ DEL (1): caracter de espacio
Por comodidad y convención de ahora en adelante ya no nos vamos a referir al caracter “H” con su representación binaria, ahora nos referiremos a él en su notación ASCII hexadecimal, es decir 0x48 (fila 4, columna 8 de la tabla).
Los caracteres de control ASCII El código ASCII reserva los primeros 32 códigos (intervalo 0x00 a 0x1F) para caracteres de control: códigos no pensados originalmente para representar información imprimible, sino para controlar dispositivos (como impresoras) que usaban ASCII. Por ejemplo, el carácter 10 representa la función "nueva línea" (line feed), que hace que una impresora avance el papel, y el carácter 27 representa la tecla "escape" que a menudo se encuentra en la esquina superior izquierda de los teclados comunes. El código 127 (los siete bits a uno), otro carácter especial, equivale a "suprimir" ("delete"). Aunque esta función se asemeja a otros caracteres de control, los diseñadores de ASCII idearon este código para poder "borrar" una sección de papel perforado (un medio de almacenamiento popular hasta la década de 1980) mediante la perforación de todos los
agujeros posibles de una posición de carácter concreta, reemplazando cualquier información previa. Muchos de los caracteres de control ASCII servían para marcar paquetes de datos, o para controlar protocolos de transmisión de datos (por ejemplo ENQuiry, con el significado: ¿hay alguna estación por ahí?, ACKnowledge: recibido o "acuse de recibo", Negative AcKnowledge: No recibido, Start Of Header: inicio de cabecera, Start of TeXt: inicio de texto, End of TeXt: final de texto, etc.). ESCape y SUBstitute permitían a un protocolo de comunicaciones, por ejemplo, marcar datos binarios para que contuviesen códigos con el mismo código que el carácter de protocolo, y que el receptor pudiese interpretarlos como datos en lugar de como caracteres propios del protocolo.
Caracteres imprimibles ASCII El código 32, el carácter espacio, designa al espacio entre palabras, y se produce normalmente por la barra espaciadora de un teclado. Los códigos del 33 al 126 se conocen como caracteres imprimibles, y representan letras, dígitos, signos de puntuación y varios símbolos.
Algunas Propiedades Especiales Pese a que a primera vista pareciera que los códigos ASCII son asignados de manera arbitraria, en realidad esto no es así. Por ejemplo: Los dígitos del 0 al 9 se representan con sus valores prefijados con el valor 0011 en binario (esto significa que la conversión de un dígito base 10 (BCD) a ASCII es una simple cuestión de tomar cada unidad BCD y prefijarla con 0011). Las cadenas de bits de las letras minúsculas y mayúsculas sólo difieren en un bit, simplificando de esta forma la conversión de uno a otro grupo. Los creadores del ASCII decidieron utilizar 7 bits para almacenar sus caracteres, 2 7 = 128; lo cual era perfecto, para habitantes ingleses. Pero sobraba un bit para completar el byte, aquel bit se utilizó como bit de paridad y así detectar errores de transmisión. No obstante con el tiempo muchos comenzaron a pensar que ese bit de paridad podría ser usado para ampliar la gama de caracteres, si sacamos cuentas 28 = 128×2 = 256 caracteres distintos, lo que permitía ampliar la gama de caracteres representados. La irrupción en el mercado de los IBM-PC, trajo consigo la necesidad de ampliar el conjunto de caracteres ASCII, como el PC se usó en todo el mundo y no en todas partes se hablaba Inglés, se tenían problemas con caracteres de otros idiomas no incluidos en el estándar ASCII (como la ñ o los caracteres acentuados del español , para los franceses la Ç o casos más complejos como el alfabeto cirílico de los rusos). La solución inicial fue equipar los IBM-PC de exportación con un conjunto de caracteres OEM, es decir,
configurado de fábrica, dependiendo de la región del mundo donde iban; todo esto para que el cliente pudiese escribir “Ñandú” sin problemas. La solución fue entonces crear ASCII extendido usando los 8 bits del byte y aprovechando los 128 bytes adicionales para representar los caracteres de otras lenguas. Desde el código 0 hasta el 127 el ASCII original se mantiene intacto, pero desde el 128 al 255 dependerá del conjunto de caracteres que tenga instalado el PC. Esta solución funcionó parcialmente pero comenzó a presentar problemas con el advenimiento de Internet y las cada vez mayores necesidades de intercambio de información. Para ilustrar la situación, imagine un texto escrito por un griego que es enviado a un equipo ubicado en un país de habla hispana. Al cargar el documento escrito en Grecia, en el equipo del destinatario se tendrán una serie de garabatos sin sentido, ya que la interpretación de los códigos se haría con la tabla de caracteres en español (Windows 1252) y no con la tabla de caracteres griegos(Windows 1253) en la que fue escrito.
Escrito en Griego Caracter Código A 65 217
Leído en Español Caracter Código A 65 Ú 217
Con los caracteres de código inferior a 127 no hay ningún problema como en el caso de A mostrada en el ejemplo. El problema se da con los caracteres de código mayos a 127 ya que cada uno se interpreta con los códigos locales de la máquina en la que se lee el documento. Esto sin contar con la cantidad de tablas que se generaron (una por cada idioma) y los problemas que quedaban sin resolver como el caso del chino en donde 128 caracteres son un número completamente insuficiente para las necesidades del lenguaje. Hubo un primer intento por resolver este problema por parte del estándar ISO-8859-1 o Latin 1, que permitía representar los caracteres de los lenguajes basados en el alfabeto latino, pero dejaba de lado muchos lenguajes, en particular prácticamente todos los de los países de oriente.
UNICODE En vista de este problema, se empezó a plantear la necesidad de un estándar Universal, el cual fue abordado por la ISO (Internacional Standards Organization) y por el Proyecto UNICODE de iniciativa privada. No obstante, aunque cada uno publica un estándar por separado, siempre el trabajo es conjunto y hay una correspondencia exacta entre los dos estándares con la siguiente equivalencia: El Unicode 1.1 es al ISO 10646-1:1993 El Unicode 3.0 corresponde al 10646-1:2000 El Unicode 3.2 es el ISO 10646-2:2001 El Unicode 4.0 es el ISO 10646:2003
La solución propuesta por UNICODE es asignar a cada caracter un valor escalar único e irrepetible. Así, pot más similitud que exista entre el caracter “B” y el caracter “ß” del alemán, UNICODE reconoce que se trata de dos entidades distintas y a cada uno le asigna un código diferente. En nomenclatura UNICODE al código del caracter se le llama punto de código (code point) que se nota con la letra U, el signo + y el valor en hexadecimal del código asignado: Caracter A a ß
Unicode U+0041 U+0061 U+00DF
Almacenamiento en memoria: La cadena Hola para su representación requiere de los carateres H o l a U+0048 U+006F U+006C U+0061
Estos pueden almacenarse en memoria como la secuencia 00 48 00 6f 00 6c 00 61 o como la secuencia 48 00 6f 00 6c 00 61 00 ( la primera llamada big-endian, la segunda little endian). Algunos computadores representan la información en formato big endian y otros en formato little endian. Como UNICODE pretende ser universal, se planteó la necesidad de permitir estos dos esquemas de representación para que la implementación fuera concordante con la representación que se haga en un sistema en particular. Para ello se reservo el código FF FE como código para señalar este hecho en una cadena. Así, si una cadena UNICODE inicia con FF FE se entiende que estará en formato big endian. Si inicia con FE FF se entenderá que es little endian. Surgieron dos preocupaciones importantes: ¿Qué hacer con todos los sistemas ya existentes que funcionaban con el estándar ASCII? En los países de habla inglesa, preocupaba también la cantidad de ceros que quedaban en la representación, generando grandes desperdicios de memoria (lo que no pasaba en otros países en donde se usaban códigos de otros caracteres). La solución para estos problema surge del estándar de representación de UNICODE UTF8 que tiene las siguientes reglas: El bit más significativo de un carácter de byte-simple es siempre 0 (i.e todos los de código menor que 7FH) Los bits más significativos del primer byte de una secuencia multi-byte determinan la longitud de la secuencia. Estos bits más significativos b110 para secuencias de dos bytes; b1110 para secuencias de tres bytes, etc. Los bytes restantes en una secuencia multi-byte tienen b10 como sus 2 bits más significativos.
Rango Unicode | UTF-8 secuencia de octetos (hexadecimal) | (binario) --------------------+--------------------------------------------0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 0020 0000-03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0400 0000-7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Algunos Ejemplos: Tómese el caracter H (Letra "H" latina mayúscula). Su punto de código (Unicode) es el U+0048, 0x48 es menor que 0x7F por lo tanto tenemos que leer de la primera fila. El binario del hexadecimal 0x48 es b1001000, por lo tanto el punto de código U+0048 se guardará en disco u/o memoria como b1000001 que es exactamente la misma representación en el sistema ASCII. Caracter a (Letra latina "a" minúscula) Punto de código U+0061. 0x61 < 0x7F por lo tanto será codificado con un byte. Binario : b1100001 . Éste segundo ejemplo también coincide con la representación binaria de la letra "a" según el juego de caracteres US-ASCII. Tómese el caracter Ñ (letra "Ñ" latina mayúscula). Punto de código : U+00D1 0xD1 > 0x7F, por lo tanto NO corresponde al primer rango 0xD1 < 0x7FF, rango correspondiente a la segunda fila. 0xD1 = b11010001 Según la tabla se utilizarán dos bytes para representar la "Ñ", es así como b11010001 se transformará en: b11000011 b10010001, su equivalente hexadecimal es 0xc3 y 0x91 respectivamente
Veamos un cuarto y último ejemplo. Letra mongolania Ali Gali Baluda: Punto de código : U+1885 0x1885 < 0xFFFF, por lo tanto el UTF-8 usará 3 bytes 0x1885 = b1 100010 000101 UTF-8 de Ali Gali Baluda = b11100001 b10100010 b10000101 = 0xE1 0xA2 0x85
Es importante que UTF8 es sólo una forma de representar UNICODE. Existen otras alternativas como UTF-16, UTF-7, SCSU.
Ejercicios: 1. Codifique el carácter cuneiforme1 U+12421 en UTF-8 2. Escriba una función en C que le permita obtener la longitud de una cadena representada en UTF-8 3. Escriba una función en C que recibe un apuntador a un carácter en una cadena representada en UTF-8. El programa retorna un apuntador al carácter anterior en la cadena. (puede suponer que el apuntador no está en la primera posición de la cadena). 4. ¿Cuántos caracteres se pueden representar usando el estándar UTF-8 tal y como se presentó en el texto? 5. Haga una función en C que recibe una cadena de caracteres ASCII que representa un número entero y retorna el entero correspondiente. 6. Escriba una función en C que recibe una cadena de caracteres ASCII que representa un número entero en binario y retorna el entero correspondiente.
1
La escritura cuneiforme es la forma más temprana conocida de expresión escrita de la que se han encontrado restos arqueológicos. Creada por los sumerios a finales del cuarto milenio AC
7. Escriba una función en C que, usando operaciones lógicas sobre bits pase a mayúsculas los caracteres de una cadena ASCII de caracteres que recibe como parámetro
Solucionario Ejercicios: 1. U+12421 = 0001 0010 0100 0010 0001 Codificación en cuatro bytes: 11110 000
10 010010
10010000 10100001
0xF0 0x92 0x90 0xC1 2. Longitud cadena utf8 int utf8Len (unsigned char * p) { int longitud, avance; unsigned char elByte; longitud = 0; while (*p != 0) { elByte = *p; avance = 1; while ( elByte & 0x8F != 0) { elByte = elByte