Domanda

Sto avendo un problema che fare con una semplice ricerca per una stringa unicode due caratteri (l'ago) all'interno di un'altra stringa (pagliaio), che può o non può essere UTF-8

Una parte del problema è che non so come specificare il codice per l'utilizzo in strpos, e non so se il PHP deve essere compilato con qualsiasi supporto speciale per il codice, o se devo usare mb_strpos che sto cercando di evitare dal momento che, inoltre, non potrebbe essere disponibile.

es. ad esempio l'ago è U+56DE U+590D (senza lo spazio)

Con preg_match potrebbe essere preg_match("@\x{56DE}\x{590D}@",$haystack) ma che richiede in realtà @u che potrebbero non essere disponibili e ottengo un Compilation failed: character value in \x{...} sequence is too large comunque.

Non voglio usare preg_match comunque come potrebbe essere significativamente più lento di strpos (ci sono altre sequenze che devono essere cercato).

Posso convertire U+56DE U+590D nella sua sequenza di byte singolo (forse 5-6 caratteri) e quindi cercare tramite strpos? non riesco a capire come convertirlo in byte se così.

Come si definisce unicode linea in PHP comunque? I media esterna di PRCE?

$blah="\u56DE\u590D"; non funziona?

Grazie per tutte le idee!

È stato utile?

Soluzione

In primo luogo, la sua domanda è mal strutturato. Ha parecchie domande in diversi punti. Si sarebbe probabilmente ottenere più risposte, se si è utilizzato una struttura più chiara: 1) descrive l'attività che si sta cercando di realizzare, 2) le limitazioni / requisiti, 3) la strategia che considerato, 4) le difficoltà che hai trovato con tale strategia / c'è uno migliore.

Detto questo, io inizio entro la fine:

  

$blah="\u56DE\u590D"; non funziona?

No. La lingua non sa nulla di unicode. In PHP, le stringhe sono array di byte. Pertanto, come si esprimono un punti di codice unicode in uno script PHP dipenda dalla codifica che si desidera utilizzare. Per UTF-8, sarebbe "\xE5\x9B\x9E\xE5\xA4\x8D", per UTF-16 big endian sarebbe "\x56\xDE\x59\x0D", e così via.

  

Posso convertire U+56DE U+590D nella sua sequenza di byte singolo (forse 5-6 caratteri) e quindi cercare tramite strpos? Non riesco a capire come convertirlo in byte se è così.

Per la prima parte, sì, cioè, convertendo U+56DE U+590D in byte, è necessario un chiarimento. Sono queste unità di codice UTF-16 o punti di codice Unicode? Per esempio, come è rappresentato 𪛖? U+D869 U+uDED6 o U+2A6D6? Se sono unità di codice Unicode, è banale per loro codificare in UTF-16. Per UTF-16 big endian, è solo "\x56\xDE\x59\x0D". In caso contrario, è ancora banale per codificarli UTF-32, ma ci vuole un po 'più di lavoro da fare lo stesso in UTF-16 (o UTF-8).

Per la seconda parte, continuate a leggere.

  

Una parte del problema è che non so come specificare il codice per l'utilizzo in strpos, e non so se il PHP deve essere compilato con qualsiasi supporto speciale per il codice, o se devo usare mb_strpos che sto cercando di evitare dal momento che, inoltre, non potrebbe essere disponibile.

Che cosa stai cercando di fare? Perché avete bisogno di trovare una posizione in una stringa? strpos vi darà un offset per una data stringa (di nuovo, interpretata in forma binaria) di byte. Stai cercando di ritagliare una stringa? strpos (o anche mb_strpos) difficoltà media in Unicode - un glifo possono essere costituiti da diverse unità di codice, così si rischia di clipping parte di un glifo. Non posso consigliare di più a meno che non dici quello che stai cercando di fare.

Altri suggerimenti

ha scritto 'potrebbe non essere disponibile'. Vi suggerisco di provare mb_strpos .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top