web-dev-qa-db-fra.com

Convertissez les caractères utf8 en iso-88591 et revenez dans PHP

Certains de mes scripts utilisent un codage différent, et lorsque j'essaie de les combiner, cela devient un problème.

Mais je ne peux pas changer l'encodage qu'ils utilisent, je veux plutôt changer l'encodage du résultat du script A et l'utiliser comme paramètre dans le script B.

Donc: existe-t-il un moyen simple de changer une chaîne de UTF-8 à ISO-88591 en PHP? J'ai regardé utf_encode et _decode, mais ils ne font pas ce que je veux. Pourquoi n’existe-t-il pas de fonction "utf2iso ()" ou similaire?

Je ne pense pas avoir des caractères qui ne peuvent pas être écrits au format ISO, donc cela ne devrait pas être un gros problème.

42
qualbeen

Regardez iconv() ou mb_convert_encoding() . En passant, pourquoi utf8_encode() et utf8_decode() ne fonctionne pas pour vous?

utf8_decode - Convertit une chaîne avec des caractères ISO-8859-1 encodés avec UTF-8 en ISO-8859-1 à un octet

utf8_encode - Encode une chaîne ISO-8859-1 en UTF-8

Donc essentiellement

$utf8 = 'ÄÖÜ'; // file must be UTF-8 encoded
$iso88591_1 = utf8_decode($utf8);
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $utf8);
$iso88591_2 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8');

$iso88591 = 'ÄÖÜ'; // file must be ISO-8859-1 encoded
$utf8_1 = utf8_encode($iso88591);
$utf8_2 = iconv('ISO-8859-1', 'UTF-8', $iso88591);
$utf8_2 = mb_convert_encoding($iso88591, 'UTF-8', 'ISO-8859-1');

tous devraient faire de même - avec utf8_en/decode() ne nécessitant aucune extension particulière, mb_convert_encoding() nécessitant ext/chaîne_bstring et iconv() nécessitant ext/iconv.

118
Stefan Gehrig

Tout d'abord, n'utilisez pas de codages différents. Cela conduit à un désordre, et UTF-8 est certainement celui que vous devriez utiliser partout.

Les chances sont que votre entrée n'est pas ISO-8859-1, mais quelque chose d'autre (ISO-8859-15, Windows-1252). Pour convertir ceux-ci, utilisez iconv ou mb_convert_encoding .

Cependant, utf8_encode et utf8_decode devrait fonctionner pour ISO-8859-1. Ce serait bien si vous pouviez poster un lien vers un fichier ou un exemple de chaîne encoded ou base64 pour laquelle la conversion échoue ou produit des résultats inattendus.

6
phihag

Il vaut beaucoup mieux utiliser

$ value = mb_convert_encode ($ value, 'HTML-ENTITIES', 'UTF-8');

Surtout lorsque vous utilisez AJAX, appelez pour la soumission de caractères 'ISO-8859-1'. Cela fonctionne pour le chinois, le japonais, le tchèque, l'allemand et de nombreuses autres langues.

1
VINAY KANT

mettre la balise méta en tête comme

 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

utilisez le lien http://www.i18nqa.com/debug/utf8-debug.html pour remplacer le caractère de symboles souhaité.

puis utilisez str_replace comme

    $find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash
                        $replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”');
$content = str_replace($find, $replace, $content);

C'est la méthode que j'utilise et aide beaucoup. Merci!

1
user2842936

Dans mon cas, après que des fichiers avec des noms contenant ces caractères aient été téléchargés, ils n'étaient même pas visibles avec Filezilla! Dans Cpanel Filemanager, ils ont été montrés? (sous fond noir). Et cette combinaison l'a fait apparaître correctement sur le navigateur (le document HTML est codé en Occident):

$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path']))) );
0
user109764

J'ai utilisé:

function utf8_to_html ($data) {
    return preg_replace(
        array (
            '/ä/',
            '/ö/',
            '/ü/',
            '/é/',
            '/à/',
            '/è/'
        ),
        array (
            '&auml;',
            '&ouml;',
            '&uuml;',
            '&eacute;',
            '&agrave;',
            '&egrave;'
        ),
        $data 
    );
}
0
tommystyle

Vous devez utiliser le package iconv , plus précisément sa fonction iconv.

0
Martin v. Löwis

Utilisez html_entity_decode() et htmlentities().

$html = html_entity_decode(htmlentities($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-1');

htmlentities() formate votre entrée en UTF8 et html_entity_decode() la recompose en ISO-8859-1.

0
Fernando CR

J'utilise cette fonction:

function formatcell($data, $num, $fill=" ") {
    $data = trim($data);
    $data=str_replace(chr(13),' ',$data);
    $data=str_replace(chr(10),' ',$data);
    // translate UTF8 to English characters
    $data = iconv('UTF-8', 'ASCII//TRANSLIT', $data);
    $data = preg_replace("/[\'\"\^\~\`]/i", '', $data);


    // fill it up with spaces
    for ($i = strlen($data); $i < $num; $i++) {
        $data .= $fill;
    }
    // limit string to num characters
   $data = substr($data, 0, $num);

    return $data;
}


echo formatcell("YES UTF8 String Zürich", 25, 'x'); //YES UTF8 String Zürichxxx
echo formatcell("NON UTF8 String Zurich", 25, 'x'); //NON UTF8 String Zurichxxx

Découvrez ma fonction dans mon blog http://www.unexpectedit.com/php/php-handling-non-english-characters-utf8

0
Ignacio Pascual