mardi, juillet 29 2008, 17:11
Caractère de l'encodage CP1252 posant problème en ISO-8859-1
Par Jean-Pascal MILCENT - Informatique - Lien permanent
32 caractères de l'encodage CP-1252 (= Windows-1252) ne sont pas compatible avec l'ISO-8859-1. Ce sont les caractères codés de \x80 à \x9f (€ à Ÿ) : € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ ‘ ’ “ ” • – — ˜ ™ š › œ Ÿ . Nous proposons de mettre en place une translittération de ces caractères...
Si vous avez besoins d'envoyer grâce à PHP des mails au format texte, il ne vous sera pas possible d'utiliser les entités HTML pour remplacer les caractères posant problème. C'est pourtant une excellente solution dans la majorité des cas. L'excellent site OpenWeb traite de ce sujet dans un article intitulé "Codage valide des caractères Windows illégaux en HTML et XHTML". Si vous ne pouvez pas non plus utiliser l'encodage UTF-8, la seule solution restante et d'effectuer une translittération de ces caractères. Voici une fonction qui pourrait vous être utile :
function translittererCp1252VersIso88591($str, $translit = true) {
$cp1252_entite_map = array(
'\x80' => '€', /* EURO SIGN */
'\x82' => '‚', /* SINGLE LOW-9 QUOTATION MARK */
'\x83' => 'ƒ', /* LATIN SMALL LETTER F WITH HOOK */
'\x84' => '„', /* DOUBLE LOW-9 QUOTATION MARK */
'\x85' => '…', /* HORIZONTAL ELLIPSIS */
'\x86' => '†', /* DAGGER */
'\x87' => '‡', /* DOUBLE DAGGER */
'\x88' => 'ˆ', /* MODIFIER LETTER CIRCUMFLEX ACCENT */
'\x89' => '‰', /* PER MILLE SIGN */
'\x8a' => 'Š', /* LATIN CAPITAL LETTER S WITH CARON */
'\x8b' => '‹', /* SINGLE LEFT-POINTING ANGLE QUOTATION */
'\x8c' => 'Œ', /* LATIN CAPITAL LIGATURE OE */
'\x8e' => 'Ž', /* LATIN CAPITAL LETTER Z WITH CARON */
'\x91' => '‘', /* LEFT SINGLE QUOTATION MARK */
'\x92' => '’', /* RIGHT SINGLE QUOTATION MARK */
'\x93' => '“', /* LEFT DOUBLE QUOTATION MARK */
'\x94' => '”', /* RIGHT DOUBLE QUOTATION MARK */
'\x95' => '•', /* BULLET */
'\x96' => '–', /* EN DASH */
'\x97' => '—', /* EM DASH */
'\x98' => '˜', /* SMALL TILDE */
'\x99' => '™', /* TRADE MARK SIGN */
'\x9a' => 'š', /* LATIN SMALL LETTER S WITH CARON */
'\x9b' => '›', /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
'\x9c' => 'œ', /* LATIN SMALL LIGATURE OE */
'\x9e' => 'ž', /* LATIN SMALL LETTER Z WITH CARON */
'\x9f' => 'Ÿ' /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);
$translit_map = array(
'€' => 'Euro', /* EURO SIGN */
'‚' => ',', /* SINGLE LOW-9 QUOTATION MARK */
'ƒ' => 'f', /* LATIN SMALL LETTER F WITH HOOK */
'„' => ',,', /* DOUBLE LOW-9 QUOTATION MARK */
'…' => '...', /* HORIZONTAL ELLIPSIS */
'†' => '+', /* DAGGER */
'‡' => '++', /* DOUBLE DAGGER */
'ˆ' => '^', /* MODIFIER LETTER CIRCUMFLEX ACCENT */
'‰' => '0/00', /* PER MILLE SIGN */
'Š' => 'S', /* LATIN CAPITAL LETTER S WITH CARON */
'‹' => '<', /* SINGLE LEFT-POINTING ANGLE QUOTATION */
'Œ' => 'OE', /* LATIN CAPITAL LIGATURE OE */
'Ž' => 'Z', /* LATIN CAPITAL LETTER Z WITH CARON */
'‘' => "'", /* LEFT SINGLE QUOTATION MARK */
'’' => "'", /* RIGHT SINGLE QUOTATION MARK */
'“' => '"', /* LEFT DOUBLE QUOTATION MARK */
'”' => '"', /* RIGHT DOUBLE QUOTATION MARK */
'•' => '*', /* BULLET */
'–' => '-', /* EN DASH */
'—' => '--', /* EM DASH */
'˜' => '~', /* SMALL TILDE */
'™' => '(TM)', /* TRADE MARK SIGN */
'š' => 's', /* LATIN SMALL LETTER S WITH CARON */
'›' => '>', /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
'œ' => 'oe', /* LATIN SMALL LIGATURE OE */
'ž' => 'z', /* LATIN SMALL LETTER Z WITH CARON */
'Ÿ' => 'Y' /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);
$str = strtr($str, $cp1252_entite_map);
if ($translit) {
$str = strtr($str, $translit_map);
}
return $str;
}
Une autre proposition de fonction réalisant à peu près la même chose est disponible sur la page de documentation de la fonction strtr du site php.net.
aucun commentaire