Caracteres

Anuncio
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 (<ALTGR>). 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 << 1;
avance++;
}
p += avance;
longitud++;
}
return longitud
}
3. Apuntador al anterior carácter
unsigned char *
utf8Prev (unsigned char * p) {
unsigned char elByte;
p--;
elByte = *p;
while (*p & 0xC0 == 0x80) {
p--;
elByte = *p;
}
return longitud
}
4. Número caracteres UTF8
6 Bytes: Los 5 últimos tienen 6 bytes de representación. El primero (descontando
los de longitud) 1 bit. En total 5*6 + 1 bits = 31bits 231 caracteres
Descargar