Codificació de caràcters

Representació de la informació

Els ordinadors treballen amb dos tipus d'informació: dades i instruccions. Per a que aquesta informació sigui processada, cal que estigui codificada d'una manera compatible amb la estructura de l'ordinador. Donat que aquesta estructura interna està formada per circuits electrònics, i que en aquest és fàcil reconèixer dos estats diferenciats, el sistema binari resulta el més natural per a codificar la informació amb la qual treballa l'ordinador.

Podriem dir que existeixen dos tipus de representacions:

interna
la que realment utilitza l'ordinador, limitada i definida per el maquinari
externa
la que utilitzen els programadors o les aplicacions, utilitzada per a representar els resultats.


Representació numèrica

Un sistema de numeració és un conjunt de regles i signes que, per convenció, permeten expressar diferents ordres de magnitud amb una base d'un sistema, que són el nombre de signes que utilitza el sistema.

Per exemple el sistema tradicional numèric que utilitzem i al que estem acostumats seria el de base 10 ja que només utilitza els següents 10 signes (0,1,2,3,4,5,6,7,8,9)

D'altres sistemes de numeració existents serien:

  • binari amb els signes 0,1
  • octal amb els signes 0,1,2,3,4,5,6,7
  • hexadecimal amb els signes 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

L'equivalent d'una numeració entre un sistema i un altre es pot realitzar fàcilment mitjançant regles establertes que permeten aquestes conversions, per exemple la xifra 21 en base 10 seria equivalent a 10101 en base 2 (binari) o  25 en base 8 (octal) o 15 en base 16 (sistema hexadecimal).

A part amb qualsevol sistema numèric podrem realitzar operacions atitmètiques. Aquestes operacions, al igual que la manera de codificar pot esser diferent segons el sistema codificador, però el significat de les operacions, operands i operadors són els mateixos (imagineu la paraula "hola", significa el mateix en tots els idiomes però hi ha milers de maneres de representar aquest significat). Al igual que els números enters, els números reals i els signes poden ser representats tot seguint convenis de representació (coma flotant, complement a un, complement a dos,...)

Representació alfanumèrica

La representació dels caràcters que composen una informació de tipus text és la següent:

  • lletres (a..z, A..Z)
  • números (0...9)
  • símbols de puntuació (., ;, :, ...)
  • caràcters especials (*, &, /, ...)

Aquesta representació es realitza assignant un codi d'una longitud fixa a cada un dels caràcters que composen aquesta informació.
Les característiques que defineixen un sistema de representació alfanumèrica son les següents:

  • Número de caràcters distints representables.
  • Longitud del codi que s'utilitza per a representar cada caràcter.
  • Codificació de cada caràcter.

Cal destacar que no existeix un criteri determinant que indiqui el codi que s'ha d'utilitzar per a representar un caràcter alfanumèric determinat (cap regla que indiqui quin codi és el mes adient). Per aquest motiu es venen utilitzant convenis (estàndards) per a aquesta codificació.
L'estàndard més estès, actualment, és el codi ASCII (American Standard Code for Information Interchange).  Aquest és un codi de 7 bits, que permet representar fins a 128 caràcters (2 elevat a 7 = 128 caràcters) que els podem trobar resumits en la taula ASCII.
Per saber que representa un codi ASCII o a l'inrevés, per saber codificar un caràcter seguiu la següent regla:

  • Format de posició dels bits: major a menor d'esquerra a dreta (7654321)
  • Exemple per a la lletra A (majúscula): A=1000001(en binari)=65(en decimal)

 

Actualment s'utilitza una versió de codi ASCII amb 8 bits, anomenada ASCII estès, que inclou els 128 caràcters anteriors més 128 nous caràcters com poden ser les lletres accentuades, caràcters especials, lletres gregues o caràcters semigràfics entre d'altres.

Si en la terminal de Linux executeu

man ascii

podreu veure una taula amb els caracters ASCII i el corresponent codi numèric.

A part com podeu comprovar hi haurà un altre taula de caràcters no imprimibles (del 1 al 32 i el 127) on per exemple el valor decimal 13 es correspon amb el retorn de carro o el 127 que és correspon amb esborrar (DELETE).

Igualment no són suficients 8 bits (256 caràcters) per codificar tots els alfabets i escriptures naturals del mon. Per resoldre aquesta problemàtica actualment s'utilitzen altres normes (estàndards o convenis) de codificació de caràcters com poden ser:

  • EBCDIC (Extended Binary Coded Decimal Interchange Code) de 8 bits.
  • Unicode: on s'assigna un codi a cada un dels mes de cinquanta mil símbols que inclouen tots els alfabets europeus, ideogrames xinesos, japonesos, coreans,... i mes d'un miler de símbols especials.
  • UTF-8: s'utilitza de forma conjunta amb el conveni Unicode on només s'utilitzen 8 bits de longitud variable
  • UTF-16: igual que el UTF-8 però utilitzen 16 bits de longitud variable

Ara penseu en certs aspectes que podem treure de profit a l'hora de programar, per exemple:

  • Podem comprovar que un caràcter que l'usuari ens entra per teclat és numèric o no
  • Calcular el valor d'un caràcter numèric, ja que per exemple, en ASCII sols s'ha de restar 48 al valor decimal del codi (mireu taula ASCII)
  • Convertir majúscules a minúscules, ja que la codificació d'una lletra majúscula i la corresponent minúscula sols es diferencien en un bit (mireu taula ASCII). De totes maneres gairebé tots els llenguatges de programació contenen funcions preestablertes que realitzen aquesta tasca amb la seva crida i passant com a paràmetre el caràcter o frase a transformar, per exemple en Python seria la funció upper del mòdul string (string.upper())