16Fermer18
ZephLe 29/03/2011 à 16:07
r043v (./16) :
mon seul soucis est que je me demande si en fait strpos va bien détecter ce char § ou si en fait il va juste mater son premier octet, et si je risque d'avoir des faux positif m'obligeant a tester également l'offset+1 pour voir si ca correspond avec le second octet de § confus

Ça marche parceque strpos ne recherche pas un caractère mais une chaine. En gros si ton code source est en UTF-8 (sick), alors le '§' de ton fichier source est un buffer de deux octets, donc ça trouve bien le '§' de ta string (ou plutôt les deux octets).

Le souci, c'est que potentiellement tu peux avoir un caractère codé sur 3 octets dont les deux derniers sont les mêmes que les 2 octets qui servent à coder un '§', d'où un faux positif : tu vas couper un caractère UTF-8 en deux, et produire un résultat totalement invalide. C'est peu probable, mais ça peut arriver.

Pour résumer, toutes les fonctions str* de PHP ne travaillent pas sur des chaines, mais sur des buffers d'octets. Si ton entrée et ta sortie sont dans le même encodage, par coup de bol ça marche donc assez souvent, mais tu risques quand même des bugs assez sournois qui vont te corrompre ta chaine quand ils vont arriver. Pour corriger ton code, il n'y a pas d'autre solution que d'utiliser des vraies fonctions qui travaillent sur de l'UTF-8.

Pour le coup de "la recherche débute", je comprends pas. Ton code ne fait qu'une seule passe sur la chaine, non ? (je ne vois qu'une seule boucle for). Du coup c'est exactement ce que ferait preg_replace, sauf que sa boucle for à lui tourne 20 fois plus vite que la tienne puisqu'elle est en C ^^