Remplacer « abc123def » par « abc 123 def » dans la chaîne multi-octets
Question
Normalement, je voudrais juste faire.
$str = preg_replace('#(\d+)#', ' $1 ', $str);
Si je savais que ça allait être utf-8 Je voudrais ajouter un minuscule « u » modificateur au modèle et je pense que je serais bon. Mais à cause de rapports de utf-8 prenant 2x et 3x dans certains cas, l'espace de stockage qu'il prendrait si le jeu de caractères natif ont été utilisés, j'essaie de ne pas limiter l'application à utf-8.
Ainsi, je suis en train de rester loin de mes fonctions préférées preg_.
La plupart des choses ont été assez simples à ce jour, mais je suis un peu coincé sur le remplacement où je normalement utiliser des classes de caractères dans preg_ tels que « \ d ».
La solution
Mettre en place une enveloppe de stockage avec mb_convert_encoding
donc en interne vous suffit de manipuler UTF-8.
(je pense toujours que vous devez besoin UTF-8 et sauver tout le monde beaucoup d'ennuis.)
Autres conseils
Je pense que le codage UTF-8 est telle que rien dans la sortie codée avec une valeur d'octet de 127 ou moins est toujours le caractère ASCII correspondant à cette valeur d'octet et jamais fait partie d'une séquence multi-octets. Ainsi, vous pouvez continuer à prétendre l'encodage est ASCII dans cette situation et ne pas causer des problèmes (comme les espaces et les chiffres sont ASCII).
Voir la description http://en.wikipedia.org/wiki/UTF-8 où il montre que tous les octets dans une séquence multi-octets ont le bit le plus significatif (par exemple, sont tous> 127).