C3 83 C6 92 C3 82 C2 AA
C3 3F C2 AA
C'est ce que vous obtenez si vous traitez la séquence d'octets comme UTF-8, puis l'encodez comme ISO-8859-1. 3F
est ?
, qui a été inclus comme caractère de remplacement, car UTF-8 C6 92
est U+0192 ƒ
qui n'existe pas dans l'ISO-8859-1. Mais il existe dans la page de codes Windows 1252 Western European, un codage très similaire à ISO-8859-1; là, c'est l'octet 0x83.
C3 83 C2 AA
Passez par une autre série de traiter-comme-UTF-8-octets-et-encoder-vers-cp1252 et vous obtenez :
C3 AA
qui est, enfin, UTF-8 pour ê
.
Notez que même si vous servez explicitement une page HTML non-XML en tant qu'ISO-8859-1, les navigateurs utiliseront en fait l'encodage cp1252, pour de mauvaises raisons historiques.
Malheureusement MySQL n'a pas d'encodage cp1252; latin1
est (correctement) ISO-8859-1. Vous ne pourrez donc pas réparer les données en vidant en latin1 puis en rechargeant en utf8 (deux fois). Vous devrez traiter le script avec un éditeur de texte qui peut enregistrer soit (ou par exemple en Python file(path, 'rb').read().decode('utf-8').encode('cp1252').decode('utf-8').encode('cp1252')
).