Sostituire “abc123def” con “abc 123 def” nella stringa multibyte
Domanda
Di norma, vorrei solo fare questo.
$str = preg_replace('#(\d+)#', ' $1 ', $str);
Se sapevo che stava per essere utf-8 vorrei aggiungere un minuscolo "u" modificatore per il modello e penso che sarebbe bene.Ma a causa delle relazioni di utf-8, tenendo 2x e, in alcuni casi, 3x lo spazio di archiviazione di quanto sarebbe necessario se il set di caratteri nativi sono stati utilizzati, sto cercando di non limitare l'applicazione a utf-8.
Così, sto cercando di stare lontano dai miei preferiti preg_ funzioni.
Più le cose sono abbastanza semplici, ma sono un po ' bloccato su sostituzioni, se io normalmente uso le classi di caratteri in preg_ come "\d".
Soluzione
Implementare un deposito wrapper con mb_convert_encoding
così internamente si dispone solo di manipolare UTF-8.
(Io continuo a pensare che dovrebbe richiedono UTF-8 e di risparmiare a tutti un sacco di guai.)
Altri suggerimenti
Penso che la codifica UTF-8 è tale che nulla in output codificati con un valore di byte di 127 o meno è sempre il carattere ASCII corrispondente valore di byte e non parte di un multi sequenza di byte.Così si può continuare a fingere la codifica ASCII in questa situazione e non causa problemi (come gli spazi e le cifre sono in ASCII).
Leggete la descrizione in http://en.wikipedia.org/wiki/UTF-8 dove si dimostra che tutti i byte in una sequenza multibyte hanno il bit più significativo set (es.sono tutti > 127).