Conversion char 1 octet <> 2 octets

Conversion char 1 octet <> 2 octets - PHP - Programmation

Marsh Posté le 02-03-2006 à 21:26:29    

Bonsoir,
Voila, je suis entrain de transposer un code C# en PHP, et une petite ligne me pose probleme;
 
En C#, voila comment ca se passe:
 

Code :
  1. for (int i=0; i<pw.Length; i++) {
  2.                     res[i*2] = (byte)(pw>>8);
  3.                     res[i*2+1] = (byte)(pw[i]);
  4.                }


 
On remarque le >>8 car c'est un encodage "latin1_swedish", sur 2 octets. En PHP par defaut, les chars etant traités sur 1 octets, je dois d'abord effectuer un transtypage du caractere à priori ... Je procede donc comme suit:
 

Citation :

 for ($i=0; $i<strlen($password); $i++) {  
   $pw[$i] = mb_convert_encoding($pw[$i], "UTF-8", "ISO-8859-1" );
   $res[$i*2]   = ($pw[$i] >> 8);
   $res[$i*2+1] = $pw[$i];
  }


 
Seulement voila, la presence ou non de la fonction [i]mb_convert_encoding ne change absolument rien au resultat ... ce qui fait que $res[$i*2] est toujours égal à zero ... Aurais-je raté quelque chose quelque part ?  :??:

Reply

Marsh Posté le 02-03-2006 à 21:26:29   

Reply

Marsh Posté le 02-03-2006 à 21:29:03    

tu as la fonction utf8_decode() qui fait ça.


---------------
N'oubliez pas de mettre [RESOLU] dans le titre quand c'est fini - Pour poster vos sources : http://paste.clicksources.com/
Reply

Marsh Posté le 02-03-2006 à 21:30:08    

je crois me souvenir que cette fonction merde pas mal, et que c'est le genre de trucs à faire à la main (voir les commentaires de la fonction http://www.php.net/manual/fr/funct [...] coding.php )

Reply

Marsh Posté le 02-03-2006 à 21:35:01    

 

Citation :

for ($i=0; $i<strlen($password); $i++) {  
   $res[$i*2]   = (utf8_decode($pw[$i]) >> 8);
   $res[$i*2+1] = $pw[$i];
  }


 
meme comme ceci en utilisant utf8_decode(), le resultat est le meme, $res[$i*2]  = 0.
 
@Djebel1: Merci pour le lien, je vais regarder ca de suite, même si j'ai pas trop idée de comment le faire à la main ...  :sweat:

Reply

Marsh Posté le 02-03-2006 à 23:01:40    

Petit exemple pour etre plus precis (j'espere)
Avec le code C#, la chaine 123456 est transformée en EF4DAFDA494AD517E9823AE7D12A4C8 apres MD5.
 
 
En PHP,  
 
md5(mb_convert_encoding($password, "UTF-8" )) ET md5(utf8_decode($password));
Renvoient tout les deux e10adc3949ba59abbe56e057f20f883e  
 
 
 
le mb_convert_encoding n'a donc pas l'air de buguer, mais le resultat n'est toujours pas celui attendu ...  :??:

Reply

Marsh Posté le 02-03-2006 à 23:15:43    

utf8_decode marchait pour moi, à condition de tester la ligne avant. Dans un script ou il me fallait absolument de l'ISO-8859-1, j'utilisais une fonction du W3C pour reconnaitre de l'UTF-8

Code :
  1. /**
  2.     * Determine si une chaine est en UTF-8
  3.     * fonction cree par le W3C
  4.     *
  5.     * @link http://w3.org/International/questi [...] utf-8.html
  6.     * @param string $string  chaine de caractere a analyser
  7.     * @return bool    vrai si UTF-8, faux sinon
  8.     */
  9.     function is_utf8($string) {
  10.     return preg_match('%^(?:
  11.     [\x09\x0A\x0D\x20-\x7E] # ASCII
  12.     | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
  13.     | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
  14.     | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
  15.     | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
  16.     | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
  17.     | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
  18.     | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
  19.     )*$%xs', $string);
  20.     }


 
et si la ligne était de l'UTF-8, alors je faisais un utf8_decode. Et pour chaque ligne il fallait revérifier si c'était de l'UTF-8, puisque bien qu'un fichier soit en UTF-8, certaines lignes ne sont pas détectées en UTF-8, et la fonction utf8_decode te sors alors de la merde


Message édité par Djebel1 le 02-03-2006 à 23:20:34
Reply

Marsh Posté le 02-03-2006 à 23:28:20    

merci Djebel1 pour cette fonction que je connaissais pas


---------------
N'oubliez pas de mettre [RESOLU] dans le titre quand c'est fini - Pour poster vos sources : http://paste.clicksources.com/
Reply

Marsh Posté le 03-03-2006 à 00:29:15    

Hum oui, je comprend ce que tu dis mais ... Je crois que je me suis mal exprimé sur un point; La variable (en l'occurence $password) que je souhaite decoder est deja en UTF8, mais je dois la faire passer dans un algo de modification, qui necessite pour cela que chaque caractere soit codé sur 2 octets et non 1 ... C'est donc le probleme inverse, je dois passer ma variable $password en codage "2 octets / Caractere"
 
Tu vois le probleme ? :/

Reply

Marsh Posté le 03-03-2006 à 01:02:19    

moui, enfin c'est pas un probleme d'encodage UTF-8 vers ISO-8859-1 quoi  :whistle:  


Message édité par Djebel1 le 03-03-2006 à 02:15:09
Reply

Marsh Posté le 03-03-2006 à 07:26:39    

Oui, exactement  :D  Ca l l'air tout simple a dire, mais j'arrive pas à le mettre en place ...

Reply

Marsh Posté le 03-03-2006 à 07:26:39   

Reply

Marsh Posté le 03-03-2006 à 07:42:23    

mais pkoi tu utilises  mb_convert_encoding pour passer de l'UTF-8 vers ISO-8859-1 alors ? C'est ça que je capte pas

Reply

Marsh Posté le 03-03-2006 à 11:46:32    

Citation :

string mb_convert_encoding ( string str, string to_encoding)


 

Citation :


for ($i=0; $i<strlen($password); $i++) {  
   $pw[$i] = mb_convert_encoding($pw[$i], "ISO-8859-1", "UTF-8" );  
   $res[$i*2]   = ($pw[$i] >> 8);  
   $res[$i*2+1] = $pw[$i];  
  }  


 
Corrigé.
En effet, autant pour moi, le FROM et le TO etaient inversés. Cela dit, md5(serialize($res)) renvoie cette fois ci 12a3b0a6e5578dd0ce9edf2ad99b8dae, qui n'est encore pas le resultat attendu ... (à savoir EF4DAFDA494AD517E9823AE7D12A4C8)
 
 :??:

Reply

Marsh Posté le 03-03-2006 à 18:05:28    

Citation :

 $extendedPass1 = "";
  for ($i=0; $i<strlen($password); $i++) {  
   $extendedPass1 .= utf8_encode(substr($password,$i,1))>>8;
   $extendedPass1 .= substr($password,$i,1);
  }


 
J'ai egalement essayé comme ca, mais toujours pas le resultat escompté .. quelqu'un aurait une idée ?  :/

Reply

Marsh Posté le 03-03-2006 à 19:34:34    

dsl, moi je connais juste un peu le passage UTF-8 vers ISO, le reste ... :x

Reply

Marsh Posté le 05-03-2006 à 16:42:09    

ok, merci quand même de ton aide :)
Personne aurait une autre idée ?

Reply

Marsh Posté le 06-03-2006 à 15:51:33    

Une idée qui vaut ce qu'elle vaut : Sans transformation du texte, est ce que t'obtiendrais pas la valeur attendus?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed