Pregunta

Me gustaría escribir un parser (HTML) basado en la máquina de estados, pero tengo dudas cómo leer Acctually / usar una entrada. Decidí cargar toda la entrada en una cadena y luego trabajar con él como con una matriz y mantener su índice como la posición de análisis actual.

No habría problemas con la codificación de un solo byte, pero en varios bytes que codifican cada valor no representa un personaje, pero un byte de un carácter.

Ejemplo:

$mb_string = 'žščř'; //4 multi-byte characters in UTF-8

for($i=0; $i < 4; $i++)
{
   echo $mb_string[$i], PHP_EOL;
}

Resultados:

Ĺ
ž
Ĺ
Ą

Esto significa que no se pueden repetir la cadena en un bucle para comprobar los caracteres individuales, porque nunca sé si estoy en el medio de un carácter o no.

Así que las preguntas son:

  • ¿Cómo múltiples bytes leyó una solo carácter de una cadena en una amigablemente rendimiento?
  • ¿Es buena idea trabajar con el cadena, ya que era una matriz en este caso?
  • ¿Cómo se lee la entrada?
¿Fue útil?

Solución

http://php.net/mb_string es lo que estás buscando

  • sólo caracteres mb_substr uno por uno
  • no hasta PHP6
  • ¿qué es exactamente la entrada? La forma más habitual, en general

Otros consejos

mb_internal_encoding("UTF-8");

$mb_string = 'žščř';

$l=mb_strlen($mb_string);

for($i=0;$i<$l;$i++){
    print(mb_substr($mb_string,$i,1)."<br/>");
}

Sin utilizar las mdb_relatedFunctions y con las secuencias codificadas de múltiples bytes puede utilizar las funciones de sub cadena estándar que se leen en múltiplos de los bytes utilizado para codificar.

Por ejemplo, para una cadena de codificación UTF-8 (2 bytes) si necesita el primer carácter de la cadena

$string = 'žščř'; //4 multi-byte characters in UTF-8

Usted tiene que conseguir los $ string [0] y $ string [1] valores, por lo que en realidad se está buscando la subcadena entre los índices 0 y 1 (para el primer carácter).

Tenga en cuenta que $ string [0] o $ string [N] harán referencia a la primera (o enésimo byte de la cadena multi-byte)

cordiales,

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