Reemplazar “abc123def” con “abc 123 def” en la cadena multibyte
Pregunta
Normalmente me acaba de hacer esto.
$str = preg_replace('#(\d+)#', ' $1 ', $str);
Si hubiera sabido que iba a ser UTF-8 Yo añadiría una minúscula "u" modificador al patrón y yo creo que sería bueno. Pero debido a los informes de UTF-8, teniendo en 2x y 3x algunos casos el espacio de almacenamiento que se necesitarían si se utilizara el carácter nativo fijado, estoy tratando de no restringir la aplicación a UTF-8.
Por lo tanto, estoy tratando de mantenerse alejado de mis funciones favoritas preg_.
La mayoría de las cosas han sido bastante sencillo hasta ahora, pero estoy un poco atascado en reemplazos en las que normalmente haría uso de las clases de caracteres en preg_ tales como "\ d".
Solución
Implementar un contenedor de almacenamiento con mb_convert_encoding
tan internamente es suficiente para manipular UTF-8.
(sigo pensando que debe requerir UTF-8 y salvar a todos un montón de problemas.)
Otros consejos
Creo que codificación UTF-8 es tal que nada en la salida codificada con un valor de byte de 127 o menos es siempre el juego de caracteres ASCII que el valor de byte y nunca parte de una secuencia de bytes múltiples. Para que pueda seguir fingiendo la codificación ASCII es en esta situación y no causar problemas (como espacios y dígitos son ASCII).
Vea la descripción en http://en.wikipedia.org/wiki/UTF-8 donde se muestra que todos los bytes en una secuencia multibyte tiene fijado el bit más significativo (por ejemplo, son todos> 127).