# Codificació de caràcters

La codificació de caràcters és el mètode que permet convertir un caràcter d'un llenguatge natural (alfabet o sil·labari) en un símbol d'un altre sistema de representació, com un nombre o una seqüència de polsos elèctrics en un sistema electrònic, aplicant normes o regles de codificació.

## Normes de codificació

Defineixen la forma en què es codifica un caràcter donat en un símbol en un altre sistema de representació. Exemples d'això són el codi Morse, el codi BCD (6-bit), la norma ASCII o la norma UTF-8, entre d'altres.

### ASCII

Per estar íntimament lligat a l'octet (i per tant als nombres enters que van del 0 al 127), el problema que presenta és que no pot codificar més de 128 símbols diferents (128 és el nombre total de diferents configuracions que es poden aconseguir amb 7 dígits binaris o digitals (0.000.000 , 0.000.001,..., 1.111.111 ), usant el vuitè dígit de cada octet (bit o dígit de paritat) per detectar algun error de transmissió. Una quota de 128 és suficient per incloure majúscules i minúscules de l'alfabet anglès, a més de xifres, puntuació, i alguns "caràcters de control" (per exemple, un que indica a una impressora que passi al full següent), però l'ASCII no inclou ni els caràcters accentuats ni el punt volat que es fa servir en català, ni tants altres símbols (signes matemàtics, lletres gregues, lletres llatines amb altres diacrítics, etc.) que són necessaris en molts contextos.

### ASCII estès

A causa de les limitacions de l'ASCII es van definir diversos codis de caràcters de 8 bits, entre ells l'ASCII estès. Tanmateix, el problema d'aquests codis de 8 bits és que cada un d'ells es defineix per un conjunt de llengües amb escriptures semblants i, per tant, no donen una solució unificada a la codificació de totes les llengües del món. És a dir, no són suficients 8 bits per codificar tots els alfabets i escriptures del món.

### Unicode

Com a solució a aquests problemes, des de 1991 s'ha acordat internacionalment utilitzar la norma Unicode, que és una gran taula, que actualment assigna un codi a cada un dels més de cinquanta mil símbols que conté, els quals abasten tots els alfabets europeus, ideogrames xinesos, japonesos, coreans, moltes altres formes d'escriptura, i més d'un miler de símbols especials.

### UTF-8

És una norma de transmissió utilitzada juntament amb la norma de codificació Unicode. Utilitzades en conjunt, funcionen de la següent manera:
* Unicode assigna els enters del 0 al 127 (un total de 128) a exactament els mateixos caràcters que ASCII
* UTF-8 empaqueta qualsevol enter del 0 al 127 en un octet "a l'antiga" però amb el vuitè dígit sempre a zero, ja que actualment el bit de paritat ja no es fa servir per a detecció d'errors
* Atès que la taula d'Unicode és tan gran, la majoria dels seus símbols estan assignats a enters majors que 127 (codis que, en conseqüència, necessiten més de set dígits per a la seva representació binària). En tots aquests casos, UTF-8 envia al començament de la representació binària del codi en qüestió en un primer octet amb dígit de paritat = 1
* El receptor d'aquest missatge, interpreta aquest dígit en 1 com a senyal que el que està sent transmès és un codi que no cap en 7 dígits binaris i, per tant, determina que el símbol complet no es podrà conèixer fins que no es llegeixi el següent octet (o fins i tot el tercer octet que segueix, si la codificació requerís tres octets). En el pitjor dels casos, potser arribi a ser necessari llegir sis octets consecutius per determinar un símbol codificat amb un número prou alt.

### Mapes de caràcters

Sovint els sistemes operatius, en especial Windows, utilitzen mapes de caràcters o pàgines de codi on barregen diverses normes aquí es troba a la figura 1 un exemple de com estan distribuïts els caràcters i les normes de codificació de caràcters per a MS DOS.

## Normes de Transmissió

Les normes de transmissió tenen com a objectiu definir la manera com els caràcters codificats (utilitzant les normes de codificació) es transmeten al canal de comunicacions (per exemple Internet)
Actualment, a Internet els missatges es transmeten en paquets que sempre consten d'un nombre enter d'octets, i la detecció d'errors ja no es fa amb el vuitè dígit de cada octet, sinó amb octets especials que automàticament s'agreguen a cada paquet. Les normes de transmissió es limiten a especificar una correspondència, reversible, entre codis (que representen caràcters), i seqüències d'octets (que han de ser transmesos en qualitat de dades).

## Taules tipogràfiques

Però, finalment, per al correu electrònic en xinès simplificat (per exemple) cal un detall important:
La taula que el Consorci Unicode publica per a ser llegida per humans, conté una representació gràfica o descripció, de cada caràcter inclòs fins aquell moment, però, els sistemes de visualització de documents, per poder funcionar, requereixen taules de tipografia, que associen un glif (dibuix) a cada caràcter que abasten, i passa que hi ha moltíssimes taules de tipografia, amb noms com Arial o Times, que dibuixen una mateixa lletra a base de matrius diferents i en diferents estils ("A" o "A"), però la gran majoria de les famílies de tipus d'impremta contenen només un petit subconjunt de tots els caràcters Unicode. Per aquest motiu, per llegir pàgines amb caràcters asiàtics, per exemple, no n'hi ha prou que el visualitzador usat "accepti" la codificació Unicode, sinó que, a més, l'ordinador ha de tenir instal·lada una taula tipogràfica prou extensa.

## Normes comunes de codificació de caràcters

* ISO 646
** BCD
** BCD (6-bit)
** ASCII
* EBCDIC
** CP930
* ISO 8859:
** ISO 8859-1 Europa occidental
** ISO 8859-2 Europa occidental i Centreeuropa
** ISO 8859-3 Europa occidental i Europa del Sud
** ISO 8859-4 Europa occidental i països bàltics (lituà, estonià i lapó)
** ISO 8859-5 alfabet ciríl·lic
** ISO 8859-6 àrab
** ISO 8859-7 grec
** ISO 8859-8 Hebreu
** ISO 8859-9 Europa occidental amb el joc de caràcters turc
** ISO 8859-10 Europa occidental amb jocs de caràcters nòrdics, incloent islandès
** ISO 8859-11 tailandès
** ISO 8859-13 llengües bàltiques i polonès
** ISO 8859-14 llengües cèltiques (gaèlic irlandès, escocès, gal·lès)
** ISO 8859-15 Afegeix el símbol d'Euro i altres a ISO 8859-1
** ISO 8859-16 llengües centreeuropees (polonès, txec, eslovac, eslovè, hongarès, albanès, romanès, alemany i italià)
* CP437, CP737, CP850, CP852, CP855, CP857, CP858, CP860, CP861, CP863, CP865, CP866, CP869
* Jocs de caràcters de Windows:
** Windows-1250 llengües centreeuropees que utilitzen un alfabet llatí, (polonès, txec, eslovac, hongarès, eslovè, serbi, croat, romanès i albanès)
** Windows-1251 lfabets ciríl·lics
** Windows-1252 llengües occidentals
** Windows-1253 grec
** Windows-1254 turc
** Windows-1255 hebreu
** Windows-1256 àrab
** Windows-1257 llengües bàltiques
** Windows-1258 vietnamita
* Mac OS Roman
* KOI8-R, KOI8-U, KOI7
* MIK
* Cork o T1
* ISCII
* VISCII
* Big5
** HKSCS
* Guobiao
** GB2312
** GBK (Pàgina de codis 936 de Microsoft)
** GB18030
* Shift JIS per al japonès (Pàgina de codis 932 de Microsoft)
* EUC-KR per al coreà (Pàgina de codis 932 de Microsoft)
* ISO-2022 i EUC per a jocs de caràcters CJK
* Unicode (i els seus subconjunts, com el Basic Multilingual Plane de 16 bits). Vegeu també UTF-8 i UTF-16.
* Ansel o ISO/IEC 6937

## Codificació de caràcters del català

Minúscules :
| caràcter | ISO-8859-1 | UTF-8 | UTF-8 | UTF-16 | UTF-16 |
| a | 0x61 | 0x61 | 0x61 | 0x00 | 0x61 |
| b | 0x62 | 0x62 | 0x62 | 0x00 | 0x62 |
| c | 0x63 | 0x63 | 0x63 | 0x00 | 0x63 |
| d | 0x64 | 0x64 | 0x64 | 0x00 | 0x64 |
| e | 0x65 | 0x65 | 0x65 | 0x00 | 0x65 |
| f | 0x66 | 0x66 | 0x66 | 0x00 | 0x66 |
| g | 0x67 | 0x67 | 0x67 | 0x00 | 0x67 |
| h | 0x68 | 0x68 | 0x68 | 0x00 | 0x68 |
| i | 0x69 | 0x69 | 0x69 | 0x00 | 0x69 |
| j | 0x6a | 0x6a | 0x6a | 0x00 | 0x6a |
| k | 0x6b | 0x6b | 0x6b | 0x00 | 0x6b |
| l | 0x6c | 0x6c | 0x6c | 0x00 | 0x6c |
| m | 0x6d | 0x6d | 0x6d | 0x00 | 0x6d |
| n | 0x6e | 0x6e | 0x6e | 0x00 | 0x6e |
| o | 0x6f | 0x6f | 0x6f | 0x00 | 0x6f |
| p | 0x70 | 0x70 | 0x70 | 0x00 | 0x70 |
| q | 0x71 | 0x71 | 0x71 | 0x00 | 0x71 |
| r | 0x72 | 0x72 | 0x72 | 0x00 | 0x72 |
| s | 0x73 | 0x73 | 0x73 | 0x00 | 0x73 |
| t | 0x74 | 0x74 | 0x74 | 0x00 | 0x74 |
| u | 0x75 | 0x75 | 0x75 | 0x00 | 0x75 |
| v | 0x76 | 0x76 | 0x76 | 0x00 | 0x76 |
| w | 0x77 | 0x77 | 0x77 | 0x00 | 0x77 |
| x | 0x78 | 0x78 | 0x78 | 0x00 | 0x78 |
| y | 0x79 | 0x79 | 0x79 | 0x00 | 0x79 |
| z | 0x7a | 0x7a | 0x7a | 0x00 | 0x7a |
Majúscules :
| caràcter | ISO-8859-1 | UTF-8 | UTF-8 | UTF-16 | UTF-16 |
| A | 0x41 | 0x41 | 0x41 | 0x00 | 0x41 |
| B | 0x42 | 0x42 | 0x42 | 0x00 | 0x42 |
| C | 0x43 | 0x43 | 0x43 | 0x00 | 0x43 |
| D | 0x44 | 0x44 | 0x44 | 0x00 | 0x44 |
| E | 0x45 | 0x45 | 0x45 | 0x00 | 0x45 |
| F | 0x46 | 0x46 | 0x46 | 0x00 | 0x46 |
| G | 0x47 | 0x47 | 0x47 | 0x00 | 0x47 |
| H | 0x48 | 0x48 | 0x48 | 0x00 | 0x48 |
| I | 0x49 | 0x49 | 0x49 | 0x00 | 0x49 |
| J | 0x4a | 0x4a | 0x4a | 0x00 | 0x4a |
| K | 0x4b | 0x4b | 0x4b | 0x00 | 0x4b |
| L | 0x4c | 0x4c | 0x4c | 0x00 | 0x4c |
| M | 0x4d | 0x4d | 0x4d | 0x00 | 0x4d |
| N | 0x4e | 0x4e | 0x4e | 0x00 | 0x4e |
| O | 0x4f | 0x4f | 0x4f | 0x00 | 0x4f |
| P | 0x50 | 0x50 | 0x50 | 0x00 | 0x50 |
| Q | 0x51 | 0x51 | 0x51 | 0x00 | 0x51 |
| R | 0x52 | 0x52 | 0x52 | 0x00 | 0x52 |
| S | 0x53 | 0x53 | 0x53 | 0x00 | 0x53 |
| T | 0x54 | 0x54 | 0x54 | 0x00 | 0x54 |
| U | 0x55 | 0x55 | 0x55 | 0x00 | 0x55 |
| V | 0x56 | 0x56 | 0x56 | 0x00 | 0x56 |
| W | 0x57 | 0x57 | 0x57 | 0x00 | 0x57 |
| X | 0x58 | 0x58 | 0x58 | 0x00 | 0x58 |
| Y | 0x59 | 0x59 | 0x59 | 0x00 | 0x59 |
| Z | 0x5a | 0x5a | 0x5a | 0x00 | 0x5a |
Accents i diacrítics :
| caràcter | ISO-8859-1 | UTF-8 | UTF-8 | UTF-16 | UTF-16 |
| à | 0xe1 | 0xc3 | 0xa1 | 0x00 | 0xe1 |
| À | 0xc1 | 0xc3 | 0x81 | 0x00 | 0xc1 |
| è | 0xe8 | 0xc3 | 0x88 | 0x00 | 0xe8 |
| È | 0xc8 | 0xc3 | 0x88 | 0x00 | 0xc8 |
| é | 0xe9 | 0xc3 | 0xa9 | 0x00 | 0xe9 |
| É | 0xc9 | 0xc3 | 0x89 | 0x00 | 0xc9 |
| í | 0xed | 0xc3 | 0xad | 0x00 | 0xed |
| Í | 0xcd | 0xc3 | 0x8d | 0x00 | 0xcd |
| ï | 0xee | 0xc3 | 0x8e | 0x00 | 0xee |
| Ï | 0xce | 0xc3 | 0x8e | 0x00 | 0xce |
| ò | 0xf2 | 0xc3 | 0xb2 | 0x00 | 0xf2 |
| Ò | 0xd2 | 0xc3 | 0x92 | 0x00 | 0xd2 |
| ó | 0xf3 | 0xc3 | 0xb3 | 0x00 | 0xf3 |
| Ó | 0xd3 | 0xc3 | 0x93 | 0x00 | 0xd3 |
| Ú | 0xfa | 0xc3 | 0xba | 0x00 | 0xfa |
| Ú | 0xda | 0xc3 | 0x9a | 0x00 | 0xda |
| Ü | 0xfc | 0xc3 | 0xbc | 0x00 | 0xfc |
| Ü | 0xdc | 0xc3 | 0x9c | 0x00 | 0xdc |
| ç | 0xe7 | 0xc3 | 0x87 | 0x00 | 0xe7 |
| Ç | 0xc7 | 0xc3 | 0x87 | 0x00 | 0xc7 |
| ñ | 0xf1 | 0xc3 | 0xb1 | 0x00 | 0xf1 |
| Ñ | 0xd1 | 0xc3 | 0x91 | 0x00 | 0xd1 |
| · | 0xb7 | 0xc2 | 0xb7 | 0x00 | 0xb7 |
Símbols :
| caràcter | ISO-8859-1 | UTF-8 | UTF-8 | UTF-16 | UTF-16 |
| ¿ | 0xbf | 0xc2 | 0xbf | 0x00 | 0xbf |
| ? | 0x3f | 0x3f | 0x3f | 0x00 | 0x3f |
| ¡ | 0xa1 | 0xc2 | 0xa1 | 0x00 | 0xa1 |
| ! | 0x21 | 0x21 | 0x21 | 0x00 | 0x21 |

## Vegeu també

* Bob Bemer

## Notes

* ↑ Un exemple senzill de codificació per a la paraula " hello " pot veure's aquí
* ↑ En aquesta taula els codis donats estan donat sota el sistema numèric hexadecimal, per veure la representació dels codis ASCII en sistemes numèrics com ara: decimal, binari i conèixer el codi ALT de teclat per als mateixos i fins i tot el nom correcte per a cada caràcter, pot utilitzar l'applet que apareix aquí.

## Referències

* ↑ Lockhart, Josh. Modern PHP: New Features and Good Practices (en anglès). O'Reilly Media, 2015, p. 105. ISBN 1491905182.

## Bibliografia

* Mackenzie, Charles E. Coded Character Sets, History and Development. 1. Addison-Wesley Publishing Company, Inc., 1980. ISBN 0-201-14460-3. LCCN 77-90165.