Pregunta

Estoy teniendo un problema de tratar con una simple búsqueda de una cadena Unicode de dos caracteres (la aguja) dentro de otra cadena (el pajar) que pueden o no pueden ser UTF-8

Parte del problema es que no sé cómo especificar el código para su uso en strpos, y no sé si PHP tiene que ser compilado con ningún apoyo especial para el código, o si tengo que usar mb_strpos lo que estoy tratando de evitar, ya que también podría no estar disponible.

ie. por ejemplo la aguja es U+56DE U+590D (sin el espacio)

Con preg_match podría ser preg_match("@\x{56DE}\x{590D}@",$haystack) pero que en realidad requiere @u que podría no estar disponible y me da una Compilation failed: character value in \x{...} sequence is too large de todos modos.

No quiero usar preg_match todos modos, ya que podría ser significativamente más lento que strpos (hay otras secuencias que tienen que ser interrogados).

¿Puedo U+56DE U+590D convertir en su secuencia de un solo byte (posiblemente 5-6 caracteres) y luego busca a él a través strpos? No puedo encontrar la manera de convertirlo en bytes si es así.

¿Cómo se especifique en línea Unicode en PHP de todos modos? Me exterior medio de PRCE?

$blah="\u56DE\u590D"; no funciona?

Gracias por cualquier idea!

¿Fue útil?

Solución

En primer lugar, su pregunta no está bien estructurado. Tiene varias preguntas en varios puntos. Es probable que tener más respuestas, si se ha utilizado una estructura más clara: 1) describir la tarea que estamos tratando de lograr, 2) las limitaciones / necesidades, 3) la estrategia que considera, 4) las dificultades que encontraste con dicha estrategia / ¿hay una mejor.

Dicho esto, voy a empezar por el final:

  

$blah="\u56DE\u590D"; no funciona?

No. El idioma no sabe nada acerca de Unicode. En PHP, las cadenas son matrices de bytes. Por lo tanto, cómo se expresa a puntos de código Unicode en un script PHP depende de la codificación que desea utilizar. Para UTF-8, que sería "\xE5\x9B\x9E\xE5\xA4\x8D", para UTF-16 big endian sería "\x56\xDE\x59\x0D", y así sucesivamente.

  

¿Puedo U+56DE U+590D convertir en su secuencia de un solo byte (posiblemente 5-6 caracteres) y luego buscar que a través de strpos? No puedo encontrar la manera de convertirlo en bytes si es así.

En, la primera parte, sí, es decir, la conversión de U+56DE U+590D en bytes, se necesita una aclaración. Son estas unidades de código UTF-16 o los puntos de código Unicode? Por ejemplo, cómo se representa 𪛖? U+D869 U+uDED6 o U+2A6D6? Si se trata de unidades de código Unicode, es trivial para codificarlas en UTF-16. Para UTF-16 big endian, es sólo "\x56\xDE\x59\x0D". De lo contrario, todavía es trivial para codificar ellos UTF-32, pero se tarda un poco más trabajo para hacer lo mismo en UTF-16 (o UTF-8).

Para la segunda parte, sigue leyendo.

  

Parte del problema es que no sé cómo especificar el código para su uso en strpos, y no sé si PHP tiene que ser compilado con ningún apoyo especial para el código, o si tengo que usar mb_strpos lo que estoy tratando de evitar, ya que también podría no estar disponible.

¿Qué estás tratando de hacer? ¿Por qué necesita para encontrar una posición en una cadena? strpos le dará una compensación para una cadena dada (de nuevo, interpretado en forma binaria) de bytes. ¿Estás tratando de cortar una cadena? strpos (o incluso mb_strpos) problemas medio en Unicode - un glifo pueden estar constituidos por varias unidades de código, por lo que se corre el riesgo de recorte parte de un glifo. No te puedo aconsejar más a menos que diga lo que estamos tratando de hacer.

Otros consejos

escribió 'pueden no estar disponibles'. Le sugiero que pruebe mb_strpos .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top