Fonction d'encodage utf8 incompréhensible

WRInaute occasionnel
bonjour
je me suis pris la tete , mais je ne comprends toujours pas que font concretement ces 2 fonctions
que j'ai trouvé sur
http://fr.php.net/utf8-decode
function utf8_to_latin9($utf8str) { // replaces utf8_decode()
$trans = array("�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�");
$wrong_utf8str = strtr($utf8str, $trans);
$latin9str = utf8_decode($wrong_utf8str);
return $latin9str;
}
function utf8_to_latin9($utf8str) { // replaces utf8_decode()
$trans = array("€"=>"¤", "� "=>"¦", "š"=>"¨", "Ž"=>"´", "ž"=>"¸", "Œ"=>"¼", "œ"=>"½", "Ÿ"=>"¾");
$wrong_utf8str = strtr($utf8str, $trans);
$latin9str = utf8_decode($wrong_utf8str);
return $latin9str;
}

si une bete en développement passe par là .il pourrait m'expliquer un peu avec un exemple concrete ,ce serait super génial.

merci
 
WRInaute accro
Comme son nom l'indique (et comme indiqué sur la page où tu l'as trouvée), cette fonction décode l'UTF-8 en ISO-8859-15 (Latin-9) au lieu de ISO-8859-1 (Latin-1). Il y a quelques caractères peu usités qui ont été remplacés par d'autres qui manquaient. Pour la France ce sont essentiellement les "oe" et "OE", le "y majuscule tréma", et surtout le symbole euro.

Ceci dit, ce n'est pas très fûté de mettre des caractères comme ça en litéral, il ferait mieux d'utiliser des séquences de type \xnn ou des chr(n), parce qu'avant que tu arrives à copier-coller tout ça "correctement" tu as du boulot...

Jacques.
 
WRInaute accro
Si ça peut t'aider, voici une fonction qui converti de ISO-8859-1 vers UTF-8. Sans les caractères "hardcodés", via la fonction mb_convert_encoding() ou iconv():

Code:
function convertIso8859ToUtf8($string){
	if(function_exists('mb_convert_encoding')){
		return mb_convert_encoding($string, "UTF-8", "ISO-8859-1");
	}
	elseif(function_exists('iconv')){
		return iconv("ISO-8859-1","UTF-8",$string);
	}
	else{
		die("mb_convert_encoding or iconv lib isn't available");
	}
}
 
WRInaute occasionnel
spout a dit:
Si ça peut t'aider, voici une fonction qui converti de ISO-8859-1 vers UTF-8. Sans les caractères "hardcodés", via la fonction mb_convert_encoding() ou iconv():

Code:
function convertIso8859ToUtf8($string){
	if(function_exists('mb_convert_encoding')){
		return mb_convert_encoding($string, "UTF-8", "ISO-8859-1");
	}
	elseif(function_exists('iconv')){
		return iconv("ISO-8859-1","UTF-8",$string);
	}
	else{
		die("mb_convert_encoding or iconv lib isn't available");
	}
}

merci
en fait ce que je comprends pas c'est l'analyse de mes codes
$trans = array("�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�");
$wrong_utf8str = strtr($utf8str, $trans);
ca veut dire koi ca !!
 
WRInaute impliqué
En fait ça ne veut rien dire !! Les "?" sont dûs à un problème d'encodage (ils remplacent des symboles non-reconnus).
 
WRInaute occasionnel
Tilt a dit:
En fait ça ne veut rien dire !! Les "?" sont dûs à un problème d'encodage (ils remplacent des symboles non-reconnus).
ah ok .du coup on risque de se retrouver avec plein de ?.s'il n'arrive pas à convertir
 
WRInaute accro
spout a dit:
Si ça peut t'aider, voici une fonction qui converti de ISO-8859-1 vers UTF-8. Sans les caractères "hardcodés", via la fonction mb_convert_encoding() ou iconv():

Code:
function convertIso8859ToUtf8($string){
	if(function_exists('mb_convert_encoding')){
		return mb_convert_encoding($string, "UTF-8", "ISO-8859-1");
	}
	elseif(function_exists('iconv')){
		return iconv("ISO-8859-1","UTF-8",$string);
	}
	else{
		die("mb_convert_encoding or iconv lib isn't available");
	}
}

Sans les caractères "hardcodés", il suffit d'utiliser utf8_decode ou utf8_encode si on traite de l'ISO-8859-1 (c'est facile, les 256 premiers caractères de la norme Unicode sont exactement les mêmes que ceux d'ISO-8859-1!).

La fonction ci-dessus est par contre utile, à condition de la modifier légèrement, si on utilise un autre jeu de caractère qu'ISO-8859-1.

Ceci dit, il est utile de rappeler que le but du jeu c'est de tout convertir en UTF-8, et que la compatibilité avec les autres encodages ne devrait être utilisée que pour lire des fichiers à ces formats (donc en se fiant à l'information "charset" fournie avec, autant que possible).

Jacques.
 
WRInaute accro
bigs32 a dit:
en fait ce que je comprends pas c'est l'analyse de mes codes
$trans = array("�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�");
$wrong_utf8str = strtr($utf8str, $trans);
ca veut dire koi ca !!

A la base, ça veut dire qu'il va replacer les 8 caractères qui ont changé par leur équivalent. Maintenant, comme indiqué sur la page où tu as pris ce code, le code en question est en UTF-8 alors que la page est service en ISO-8859-1 (ou l'inverse), donc ça fait plein de caca, et si tu veux pouvoir utiliser le dit code il faut vraiment être sûr de récupérer ça au niveau "binaire".

C'est pour ça que je disais que ce n'est pas très fûté, parce qu'entre les problèmes d'encodage sur le site PHP, au moment de ton copier-coller, dans ton souce PHP, etc, il y a peu de chances que ça passe sans casse, et il vaudrait donc mieux avoir la même chose avec des \xnn qui eux, passeraient à tous les coups.

Mais comme évoqué plus haut, si elles sont disponibles, il vaut mieux utiliser les fonctions mb_convert_ ou iconv_ qui font déjà tout ça très bien et connaissent nettement plus d'encodages.

Jacques.
 
WRInaute occasionnel
jcaron a dit:
bigs32 a dit:
en fait ce que je comprends pas c'est l'analyse de mes codes
$trans = array("�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�", "�"=>"�");
$wrong_utf8str = strtr($utf8str, $trans);
ca veut dire koi ca !!

A la base, ça veut dire qu'il va replacer les 8 caractères qui ont changé par leur équivalent. Maintenant, comme indiqué sur la page où tu as pris ce code, le code en question est en UTF-8 alors que la page est service en ISO-8859-1 (ou l'inverse), donc ça fait plein de caca, et si tu veux pouvoir utiliser le dit code il faut vraiment être sûr de récupérer ça au niveau "binaire".

C'est pour ça que je disais que ce n'est pas très fûté, parce qu'entre les problèmes d'encodage sur le site PHP, au moment de ton copier-coller, dans ton souce PHP, etc, il y a peu de chances que ça passe sans casse, et il vaudrait donc mieux avoir la même chose avec des \xnn qui eux, passeraient à tous les coups.

Mais comme évoqué plus haut, si elles sont disponibles, il vaut mieux utiliser les fonctions mb_convert_ ou iconv_ qui font déjà tout ça très bien et connaissent nettement plus d'encodages.

Jacques.
mais oui , je comprends mieux .
je suis en firefox et j'ai changé l'encodage .et effectivement la fonction s'ecrit autrement .
sinon c'est vrai en binaire c'est mieux mais je comprends pas trop des \xnn comme tu dis .
il y a des infos là dessus ?
 
WRInaute accro
bigs32 a dit:
je comprends pas trop des \xnn comme tu dis .
il y a des infos là dessus ?

Dans une chaîne de caractères (délimitée par des " et pas par des '), tu peux utiliser une notation en \xnn pour n'importe quel caractère, nn étant le code hexa du caractère correspondant.

Par exemple "\x20" c'est un espace :)

Ca a l'avantage que comme ça n'utilise que des caractères qui sont les mêmes pour tout le monde, il n'y a pas de risque de "perte" en cours de route.

Tu peux faire la même chose avec \nnn où nnn est la notation en octal. Je te rassure, personne n'utilise ça :)

De la même façon, il y a quelques codes \x genre \n qui est le "linefeed" (LF, ASCII 10 décimal, 0a hex, 12 octal). Donc \n et \x0a ou encore \012 c'est la même chose.

C'est documenté ici:

http://www.php.net/manual/en/language.t ... tax.double

Sinon il semblerait aussi qu'il y ait une notation en %uxxxx pour les caractères UTF-8... Pas un grand pro de PHP, donc je passe mon tour...

Jacques.
 
Discussions similaires
Haut