Depuis plus de 5 ans j'importe un fichier plat généré par un application sur laquelle je n'ai aucun contrôle. J'ai cherché au début de déterminer quel codepage était utilisé pour ce fichier. Aucune ne semblait correspondre. Je me suis donc résolu a faire un strtr() sur l'ensemble des caractères sur une base empirique. Je suis parti de la codepage CP850 qui semblait s'en rapprocher le plus et par essai erreur j'ai pu constituer une table de remplacement qui marche (voir plus loin pour référence) . Mais c'est d'un lourd! A chaque import quotidien, ça rame à mort (gros fichier). De plus à chaque nouveau caractère non mappé, je dois m'y remettre.
J'ai essayé toutes les tables connues par iconv de linux. Toutes celles de ce site http://www.eki.ee/letter/ et plein d'autres choses encore.
Quand je pose la question à la société qui a développé l'application qui exporte le fichier plat, ils n'en savent rien et m'ont même demandé ce qu'était qu'une codepage. Bref, ça commence à m'énerver.
Par exemple, pour le caractère @, ils exportent un hex 86. Il me faudrait un site qui propose un "reverse lookup" avec en entrée le caractère et son code hex.
Une piste, un signe dans le ciel ou le marc de café?
Pour référence, mon mapping actuel vers ISO 8859-1:
$array_cp850 = array(
"\x80"=>"\xC7", "\x81"=>"\xFC", "\x82"=>"\xE9", "\x83"=>"\xE2", "\x84"=>"\xE4", "\x85"=>"\xE0", "\x86"=>"\xE5",
"\x87"=>"\xE7", "\x88"=>"\xEA", "\x89"=>"\xEB", "\x90"=>"\xC9", "\x91"=>"\xE6", "\x92"=>"\xC6", "\x93"=>"\xF4",
"\x94"=>"\xF6", "\x95"=>"\xF2", "\x96"=>"\xFB", "\x97"=>"\xF9", "\x98"=>"\xFF", "\x99"=>"\xD6", "\x8A"=>"\xE8",
"\x8B"=>"\xEF", "\x8C"=>"\xEE", "\x8D"=>"\xEC", "\x8E"=>"\xC4", "\x8F"=>"\xC5", "\x9A"=>"\xDC", "\x9B"=>"\xF8",
"\x9C"=>"\xA3", "\x9D"=>"\xD8", "\x9E"=>"\xD7", "\x9F"=>"\xA0", "\xA0"=>"\xE1", "\xA1"=>"\xED", "\xA2"=>"\xF3",
"\xA3"=>"\xFA", "\xA4"=>"\xF1", "\xA5"=>"\xD1", "\xA6"=>"\xAA", "\xA7"=>"\xBA", "\xA8"=>"\xBF", "\xA9"=>"\xAE",
"\xAA"=>"\xAC", "\xAB"=>"\xBD", "\xAC"=>"\xBC", "\xAD"=>"\xA1", "\xAE"=>"\xAB", "\xAF"=>"\xBB", "\xB0"=>"\xA0",
"\xB1"=>"\xA0", "\xB2"=>"\xA0", "\xB3"=>"\xA0", "\xB4"=>"\xA0", "\xB5"=>"\xC1", "\xB6"=>"\xC2", "\xB7"=>"\xC0",
"\xB8"=>"\xA9", "\xB9"=>"\xA0", "\xBA"=>"\xA0", "\xBB"=>"\xA0", "\xBC"=>"\xA0", "\xBD"=>"\xA2", "\xBE"=>"\xA5",
"\xBF"=>"\xA0", "\xC0"=>"\xA0", "\xC1"=>"\xA0", "\xC2"=>"\xA0", "\xC3"=>"\xA0", "\xC4"=>"\xA0", "\xC5"=>"\xA0",
"\xC6"=>"\xE3", "\xC7"=>"\xC3", "\xC8"=>"\xA0", "\xC9"=>"\xA0", "\xCA"=>"\xA0", "\xCB"=>"\xA0", "\xCC"=>"\xA0",
"\xCD"=>"\xA0", "\xCE"=>"\xA0", "\xCF"=>"\xA4", "\xD0"=>"\xF0", "\xD1"=>"\xD0", "\xD2"=>"\xCA", "\xD3"=>"\xCB",
"\xD4"=>"\xC8", "\xD5"=>"\xA0", "\xD6"=>"\xCD", "\xD7"=>"\xCE", "\xD8"=>"\xCF", "\xD9"=>"\xA0", "\xDA"=>"\xA0",
"\xDB"=>"\xA0", "\xDC"=>"\xA0", "\xDD"=>"\xA6", "\xDE"=>"\xCC", "\xDF"=>"\xA0", "\xE0"=>"\xD3", "\xE1"=>"\xDF",
"\xE2"=>"\xD4", "\xE3"=>"\xD2", "\xE5"=>"\xD5", "\xE6"=>"\xB5", "\xE7"=>"\xFE", "\xE8"=>"\xDE", "\xE9"=>"\xDA",
"\xEA"=>"\xDB", "\xEB"=>"\xD9", "\xEC"=>"\xFD", "\xED"=>"\xDD", "\xEE"=>"\xAF", "\xEF"=>"\xB4", "\xF0"=>"\xAD",
"\xF1"=>"\xB1", "\xF2"=>"\xA0", "\xF3"=>"\xBE", "\xF4"=>"\xB6", "\xF5"=>"\xA7", "\xF6"=>"\xF7", "\xF7"=>"\xB8",
"\xF8"=>"\xB0", "\xF9"=>"\xA8", "\xFA"=>"\xB7", "\xFB"=>"\xB9", "\xFC"=>"\xB3", "\xFD"=>"\xB2", "\xFE"=>"\xA0",
"\xFF"=>"\xA0", "\x86"=>"\x40");