2012-10-12 13 views
6

Ho un sito Web in esecuzione su Ruby 1.8.7. Ho una convalida su un post in entrata che verifica che consentiamo fino a un massimo di 12000 caratteri. Gli spazi vengono contati come caratteri e la tabulazione e i ritorni a capo vengono rimossi prima che il post sia sottoposto alla convalida.Differenza di lunghezza delle stringhe tra rubino 1.8 e 1.9

Ecco il palo che viene sottoposta a convalida http://pastie.org/5047582

Nel rubino 1.9 la lunghezza della stringa presenta come 11909 che è corretto. Ma quando controllo la lunghezza su ruby ​​1.8.7 risulta essere 12044.

Ho usato codepad.org per eseguire questo codice ruby ​​che mi dà http://codepad.org/OxgSuKGZ (che restituisce la lunghezza come 12044 che è errata) ma quando ho esegui questo stesso codice nella console su codeacademy.org la lunghezza della stringa è 11909.

Qualcuno può spiegarmi perché questo sta accadendo ???

Grazie

risposta

11

Questo è un problema Unicode. La stringa che stai utilizzando contiene caratteri al di fuori dell'intervallo ASCII e la codifica UTF-8 utilizzata di frequente codifica come 2 (o più) byte.

Ruby 1.8 non gestire Unicode correttamente, e length dà semplicemente il numero di byte nella stringa, che si traduce in cose divertenti come:

"ą".length 
=> 2 

Ruby 1.9 ha una migliore maneggevolezza Unicode. Questo include length restituendo il numero effettivo di caratteri nella stringa, fino a quando Rubino conosce la codifica:

"ä".length 
=> 1 

Una soluzione possibile in Ruby 1.8 sta usando le espressioni regolari, che può essere fatta Unicode a conoscenza:

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

Grazie per la risposta. Ma se controlli attentamente la stringa nei pastie vedrai che non ci sono caratteri unicode nel post. Hai l'elenco dei caratteri che sono contati su byte anziché su caratteri ?? – Raghu

+1

Ci sono - le virgolette per esempio non sono il carattere "" ', ma separano virgolette e virgole a destra, che non sono ASCII –

+0

ok, questo ha un senso – Raghu

Problemi correlati