2010-03-20 20 views
6

Uso document.getElementById("text").value.length para obtener la longitud de cadena a través de javascript, y mb_strlen($_POST['text']) para obtener la longitud de cadena por PHP y ambas difieren mucho. Los retornos de carro se convierten en javascript antes de obtener la longitud de la cadena, pero supongo que algunos caracteres no se cuentan.Longitud de cadena Javascript difiere de PHP mb_strlen

Por ejemplo,

[b] 15. Umieszczanie obrazka logo z na stronie zespołu [/ b]

Este bloque de texto se calcula 57 en JavaScript y 58 en PHP. Cuando el texto se alarga, la diferencia aumenta. ¿Hay alguna forma de superar esto?

+0

Qué codificación está trabajando con el JavaScript del lado? –

+0

¿Puedes hacer un ejemplo con más diferencias que solo uno (que podría ser hasta contar saltos de línea o lo que sea)? Presumiblemente, cuantos más caracteres especiales como '³ 'uses, la brecha se ampliará. –

+3

¿Ha intentado utilizar el segundo argumento opcional para especificar una codificación? Supongo que usted ha transcrito la muestra a nosotros ascii y que la cadena real no lo es. – Fredrik

Respuesta

0

Noté que hay un carácter no estándar allí (el ł) - No estoy seguro de cómo cuenta PHP no estándar - pero podría estar contando eso como dos. ¿Qué sucede si ejecuta la prueba sin ese personaje?

+0

Sin eso es exacto, ya he estado sospechando que se trata de la codificación ... ¿Hay una función equivalente para Javascript? – TheOnly92

+0

@ TheOnly92, ¿por qué quieres arreglarlo al final que ya lo está haciendo correctamente? ¿No es mejor decirle al final del PHP cómo debe calcular la longitud correctamente (ver el comentario de Matthew a su pregunta). – Fredrik

+0

El hecho es que mi colación de almacenamiento de base de datos no tiene en cuenta utf8, creo, cuenta esas longitudes de caracteres como 2 ... – TheOnly92

1

he encontrado una función equivalente mb_strlen para Javascript, tal vez esto podría ser útil para otra persona:

function mb_strlen(str) { 
    var len = 0; 
    for(var i = 0; i < str.length; i++) { 
     len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? 2 : 1; 
    } 
    return len; 
} 

Gracias a todos los que trataron de ayudar!

+0

¿Quién sabía que los caracteres de varios bytes se codificaron utilizando 3 bytes? La primera vez que oí hablar de él ... –

+0

@PP Por supuesto, es incorrecto y la función solo funcionará para mezclas de caracteres en el rango 0-127 o en un juego de caracteres que no cabe en dos. Realmente creo que @ TheOnly92 debería resolverlo bien en su lugar. – Fredrik

+0

-1. 'ç' toma 2 bytes en UTF-8. – kennytm

4

Si usted está tratando de obtener la longitud de una cadena codificada en UTF-8 en PHP, se debe especificar la codificación en el segundo parámetro de mb_strlen, así:

mb_strlen($_POST['text'], 'UTF-8') 

Además, no olvida llamar al stripslashes en el POST-var.

0

Esto debería hacer el truco

function mb_strlen (s) { 
    return ~-encodeURI(s).split(/%..|./).length; 
} 
Cuestiones relacionadas