2012-10-12 300 views
6

Tengo un sitio web que se ejecutan en eso rubí 1.8.7. Tengo una validación en una publicación entrante que verifica para asegurarse de que permitamos hasta un máximo de 12000 caracteres. Los espacios se cuentan como caracteres y las tabulaciones y retornos de carro se quitan antes de que la publicación se someta a la validación.diferencia de longitud de cadena entre 1,8 y 1,9 rubí

Aquí es el poste que se somete a la validación http://pastie.org/5047582

En rubí 1,9 la longitud de cadena se muestra como 11909, que es correcta. Pero cuando compruebo la longitud en ruby ​​1.8.7 resulta ser 12044.

Utilicé codepad.org para ejecutar este código ruby ​​que me da http://codepad.org/OxgSuKGZ (que da como resultado la longitud 12044 que es incorrecta) pero cuando ejecutar este mismo código en la consola en codeacademy.org la longitud de cadena es 11909.

¿alguien puede explicar por qué ocurre esto ???

Gracias

Respuesta

11

Este es un problema Unicode. La cadena que está utilizando contiene caracteres fuera del rango ASCII, y la codificación UTF-8 que se usa con frecuencia codifica esos caracteres como 2 (o más) bytes.

Rubí 1.8 no maneja adecuadamente Unicode, y length simplemente indica el número de bytes en la cadena, que se traduce en cosas divertidas, como:

"ą".length 
=> 2 

Ruby 1.9 tiene un mejor manejo de Unicode. Esto incluye length devolver el número real de caracteres en la cadena, siempre y cuando Rubí conoce la codificación:

"ä".length 
=> 1 

Una posible solución en Ruby 1.8 es el uso de expresiones regulares, que puede estar hecho de Unicode en cuenta:

"ą".scan(/./mu).size 
=> 1 
+0

gracias por responder. Pero si revisas cuidadosamente la cadena en el pasado, verás que no hay caracteres Unicode en la publicación. ¿Tienes la lista de caracteres que se cuentan en bytes en lugar de caracteres? Hay – Raghu

+1

- las comillas, por ejemplo, no son el '" 'carácter, pero marca izquierda y derecha de cotización caracteres separados, que no son ASCII –

+0

gracias ok que tenga sentido – Raghu

Cuestiones relacionadas