houlà !!
un message en anglais utilise uniquement la table ASCII (7 premiers bits de l'octet, soit 128 caractères), un message en français utilise le 8ème bit de l'octet pour coder les voyelles accentués, le "ç" etc etc, mais en aucun cas un deuxième octet. Le français n'a pas besoin de 65536 caractères (2^ 6) pour coder son alphabet tout de même.
Bonjour,
Cela me semble faux. Le Français codé en UTF8 peut prendre 2 octets là où il ne faisait avant qu' 1 octet avec le jeu de caractères ANSI. ANSI ce n'est pas ASCII.
exemple de conversion de CP850 ( ANSI ) vers UTF8 :
void put_utf8(std::ostringstream& dst, unsigned char c)
{
static int const table[128] = { 0x00c7, 0x00fc, 0x00e9, 0x00e2,
0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee,
0x00ec, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2,
0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7,
0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591,
0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, 0x00a9, 0x2563,
0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, 0x2514, 0x2534, 0x252c,
0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, 0x255a, 0x2554, 0x2569, 0x2566,
0x2560, 0x2550, 0x256c, 0x00a4, 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8,
0x0131, 0x00cd, 0x00ce, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6,
0x00cc, 0x2580, 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5,
0x00fe, 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4,
0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, 0x00b0,
0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0 };
if ( c < 128)
{
dst.put(c); // ascii
}
else
{
int unicode = table [c - 128];
if (unicode <= 0x07FF)
{ dst.put(0xC0 | (unicode >> 6));
dst.put(0x80 | (unicode & 0x3F));
}
else // unicode <= 0xFFFF
{
dst.put(0xE0 | (unicode >> 12));
dst.put(0x80 | ((unicode >> 6) & 0x3F));
dst.put(0x80 | (unicode & 0x3F));
}
}
}
void to_utf8( char * z )
{
if( !z ) return ;
size_t len = strlen(z);
std::ostringstream os ;
for( register size_t i = 0 ; i < len ; i++ )
{
put_utf8( os, z[i] );
}
// récuperer => os.str().c_str() ;
}
Les caractères accentués et hors 128 sont codés sur 2 octets. UTF8 permet de coder jusque sur 4 octets selon l'alphabet en question. L'Anglais n'utilise qu' 1 octet.
Cordialement.