Présentation : 😈

année 1980 : ASCII pur (anglais seulement)
année 1990 : ASCII étendu (chaque région le sien) nous en france Latin-1
année 2000 : UTF-8 (tout le monde, enfin compatible)

UTF-8 est compatible avec ASCII (on dit plutôt « rétrocompatible »

# manuel de l'ascii 7 bits
man ascii
# manuel de l'ascii etendu 8 bits (latin-1)
man iso-8859-1
# manuel de tous les caractères 
man utf8

Les codes ASCII

American
Standard
Code for
Information
Interchange

Les vraies commandes après ESC

Dans les séquences ANSI, après \033 on peut avoir :

  • [ → séquence CSI (Control Sequence Introducer) pour les commandes paramétrées
    • Ex: \033[2J (clear), \033[H (home), \033[31m (couleur)
  • c → commande directe RIS (Reset)
  • D → Index (défilement vers le bas)
  • M → Reverse Index (défilement vers le haut)
  • E → Next Line
  • 7 → Save cursor position
  • 8 → Restore cursor position

D’autres séquences « directes » sans [

SéquenceSignification
\033cReset complet du terminal
\033EPassage à la ligne suivante (NL)
\033DDéfilement vers le bas (Index)
\033MDéfilement vers le haut (Reverse Index)
\0337Sauvegarde de la position du curseur
\0338Restauration de la position du curseur

Par exeemple:

printf "\033c"    #permet d'effacer l'ecran 
# ou 
echo -e "\033c"  
# ou
printf "\x1bc"
📌 Table ASCII (0-127)

Caractères de contrôle (0-31)

DécimalHexadécimalSymboleDescription
000NULNull (caractère nul)
101SOHStart of Heading
202STXStart of Text
303ETXEnd of Text
404EOTEnd of Transmission
505ENQEnquiry
606ACKAcknowledgment
707BELBell (sonnerie)
808BSBackspace
909HTHorizontal Tab
100ALFLine Feed (nouvelle ligne)
110BVTVertical Tab
120CFFForm Feed (nouvelle page)
130DCRCarriage Return (retour chariot)
140ESOShift Out
150FSIShift In
1610DLEData Link Escape
1711DC1Device Control 1
1812DC2Device Control 2
1913DC3Device Control 3
2014DC4Device Control 4
2115NAKNegative Acknowledgment
2216SYNSynchronous Idle
2317ETBEnd of Transmission Block
2418CANCancel
2519EMEnd of Medium
261ASUBSubstitute
271BESCEscape
281CFSFile Separator
291DGSGroup Separator
301ERSRecord Separator
311FUSUnit Separator

Caractères imprimables (32-127)

DécimalHexCaractèreDescription
3220␣Espace
3321!Point d’exclamation
3422« Guillemet double
3523#Dièse
3624$Dollar
3725%Pourcent
3826&Esperluette
3927‘Apostrophe
4028(Parenthèse ouvrante
4129)Parenthèse fermante
422A*Astérisque
432B+Plus
442C,Virgule
452D–Trait d’union
462E.Point
472F/Barre oblique
48–5730–390–9Chiffres
583A:Deux-points
593B;Point-virgule
603C<Inférieur à
613D=Égal
623E>Supérieur à
633F?Point d’interrogation
6440@Arobase
65–9041–5AA–ZLettres majuscules
915B[Crochet ouvrant
925C\Barre oblique inverse
935D]Crochet fermant
945E^Accent circonflexe
955F_Trait de soulignement
9660`Accent grave
97–12261–7Aa–zLettres minuscules
1237B{Accolade ouvrante
1247C|Barre verticale
1257D}Accolade fermante
1267E~Tilde
1277FDELDelete (suppression)

Code ASCII Etendu

💡 À savoir

  • ASCII étendu (128–255) varie selon les pages de codes (ISO-8859, Windows-1252, etc.).
  • Aujourd’hui, Unicode (UTF-8) a largement remplacé ASCII pour supporter toutes les langues.
  • Chaque caractère ASCII occupe 7 bits (mais est souvent stocké sur 1 octet/8 bits).

Plages UTF-8 de base

Plage (hex)OctetsDescriptionExemples
U+0000 à U+007F1Identique à l’ASCIIA = 41h, 0 = 30h
U+0080 à U+07FF2Latin étendu, grec, arabe, etc.é = C3 A9, π = CF 80
U+0800 à U+FFFF3Chinois, japonais, coréen, etc.文 = E6 96 87, 🎨 = F0 9F 8E A8
U+10000 à U+10FFFF4Emojis, symboles spéciaux😀 = F0 9F 98 80
CaractèrePoint UnicodeSéquence UTF-8 (hex)Remarque
éU+00E9C3 A9e accent aigu (2 octets)
€U+20ACE2 82 ACSymbole euro (3 octets)
文U+6587E6 96 87Caractère chinois (3 octets)
🎉U+1F389F0 9F 8E 89Emoji (4 octets)
bruno@elliott:~$ echo -n "é" | od -An -tx1
c3 a9
bruno@elliott:~$ echo -n "ê" | od -An -tx1
c3 aa
bruno@elliott:~$ echo -n "è" | od -An -tx1
c3 a8
bruno@elliott:~$ echo -n "@" | od -An -tx1
40
bruno@elliott:~$ echo -n "A" | od -An -tx1
41
bruno@elliott:~$ echo -n "a" | od -An -tx1
61

UTF-8 et Latin-1

# En UTF-8 (défaut)
echo -n "é" | od -tx1
# Sortie : c3 a9

# En ISO-8859-1 (Latin-1)
echo -n "é" | iconv -f UTF-8 -t ISO-8859-1 | od -tx1
# Sortie : e9

ASCII ETENDU

Latin-1 fait partie d’une famille :

  • ISO-8859-1 : Europe occidentale (Latin-1)
  • ISO-8859-2 : Europe centrale
  • ISO-8859-5 : Cyrillique
  • ISO-8859-6 : Arabe
  • ISO-8859-7 : Grec
  • ISO-8859-15 : Latin-9 (remplace Latin-1, ajoute le symbole €)

ASCII ETENDU LATIN-1

Hex | 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
----|----------------------------------------------------------------
0x0 | NUL SOH STX ETX EOT ENQ ACK BEL BS  HT  LF  VT  FF  CR  SO  SI 
0x1 | DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM  SUB ESC FS  GS  RS  US 
0x2 | SP  !   "   #   $   %   &   '   (   )   *   +   ,   -   .   / 
0x3 | 0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ? 
0x4 | @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O 
0x5 | P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _ 
0x6 | `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o 
0x7 | p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~   DEL
0x8 | PAD HOP BPH NBH IND NEL SSA ESA HTS HTJ VTS PLD PLU RI  SS2 SS3
0x9 | DCS PU1 PU2 STS CCH MW  SPA EPA   -  -  -  -  -  -  -  -  - 
0xA | -   ¡   ¢   £   ¤   ¥   ¦   §   ¨   ©   ª   «   ¬   ®   ¯   -
0xB | °   ±   ²   ³   ´   µ   ¶   ·   ¸   ¹   º   »   ¼   ½   ¾   ¿
0xC | À   Á   Â   Ã   Ä   Å   Æ   Ç   È   É   Ê   Ë   Ì   Í   Î   Ï
0xD | Ð   Ñ   Ò   Ó   Ô   Õ   Ö   ×   Ø   Ù   Ú   Û   Ü   Ý   Þ   ß
0xE | à   á   â   ã   ä   å   æ   ç   è   é   ê   ë   ì   í   î   ï
0xF | ð   ñ   ò   ó   ô   õ   ö   ÷   ø   ù   ú   û   ü   ý   þ   ÿ

Conversions

on dispose de iconv sous linux .

iconv -f ISO-8859-1 -t UTF-8 source.txt -o utf8.txt

Caractères unicode smiley wikipedia

Par thèmes : SMILEY

Petit script shell pour afficher les smileys ..

liste.sh :

for cp in $(seq 0x1F600 0x1F64F); do
  printf "U+%X  " "$cp"
  printf "\\U$(printf '%08X' "$cp")"
  printf "\n"
done
printf '\U0001F606\n' # pour afficher # 😂  \U afficher Unicode
bruno@debian13:~/Works/UTF-8$ printf '\U1F606\n' | hexdump -C
00000000  f0 9f 98 86 0a                                    |.....|
00000005

Un caractère codé sur 4 octets en UTF-8 suit ce schéma :

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

les octets en binaire:

F0 = 1111 0000
9F = 1001 1111
98 = 1001 1000
86 = 1000 0110

On les aligne sur le motif :

11110xxx  10xxxxxx  10xxxxxx  10xxxxxx
11110000  10011111  10011000  10000110

on extrait les bits:

 On extrait les bits x
Octet 1 : 11110 000 → les 3 bits utiles sont 000
Octet 2 : 10 011111 → les 6 bits utiles sont 011111
Octet 3 : 10 011000 → les 6 bits utiles sont 011000
Octet 4 : 10 000110 → les 6 bits utiles sont 000110

ce qui donne:
000011111011000000110

Ce qui donne !

0000 0001 1111 0110 0000 0110
0x01F606
Liste.sh

bruno@debian13:~/Works/UTF-8$ ./liste.sh
U+1F600 😀
U+1F601 😁
U+1F602 😂
U+1F603 😃
U+1F604 😄
U+1F605 😅
U+1F606 😆
U+1F607 😇
U+1F608 😈
U+1F609 😉
U+1F60A 😊
U+1F60B 😋
U+1F60C 😌
U+1F60D 😍
U+1F60E 😎
U+1F60F 😏
U+1F610 😐
U+1F611 😑
U+1F612 😒
U+1F613 😓
U+1F614 😔
U+1F615 😕
U+1F616 😖
U+1F617 😗
U+1F618 😘
U+1F619 😙
U+1F61A 😚
U+1F61B 😛
U+1F61C 😜
U+1F61D 😝
U+1F61E 😞
U+1F61F 😟
U+1F620 😠
U+1F621 😡
U+1F622 😢
U+1F623 😣
U+1F624 😤
U+1F625 😥
U+1F626 😦
U+1F627 😧
U+1F628 😨
U+1F629 😩
U+1F62A 😪
U+1F62B 😫
U+1F62C 😬
U+1F62D 😭
U+1F62E 😮
U+1F62F 😯
U+1F630 😰
U+1F631 😱
U+1F632 😲
U+1F633 😳
U+1F634 😴
U+1F635 😵
U+1F636 😶
U+1F637 😷
U+1F638 😸
U+1F639 😹
U+1F63A 😺
U+1F63B 😻
U+1F63C 😼
U+1F63D 😽
U+1F63E 😾
U+1F63F 😿
U+1F640 🙀
U+1F641 🙁
U+1F642 🙂
U+1F643 🙃
U+1F644 🙄
U+1F645 🙅
U+1F646 🙆
U+1F647 🙇
U+1F648 🙈
U+1F649 🙉
U+1F64A 🙊
U+1F64B 🙋
U+1F64C 🙌
U+1F64D 🙍
U+1F64E 🙎
U+1F64F 🙏