2008-11-02 19 views
11

En RoR, cómo validar una palabra china o japonesa para un formulario de publicación con código utf8.Cómo usar expresiones regulares para utf8 en ruby ​​

En código GBK, usa [\ u4e00- \ u9fa5] + para validar palabras en chino. En Php, utiliza/^ [\ x {4e00} - \ x {9fa5}] + $/u para las páginas de utf-8.

Respuesta

10

Ruby 1.8 no es compatible con cadenas UTF-8. Usted tiene que escribir los bytes de forma individual en la expresión regular, en lugar del código completo:

>> "acentuação".scan(/\xC3\xA7/) 
=> ["ç"]  

para que coincida con el rango que ha especificado la expresión se convertirá en un poco complicado:

/([\x4E-\x9E][\x00-\xFF])|(\x9F[\x00-\xA5])/ # (untested) 

That will be improved in Ruby 1.9, sin embargo.

Editar: Como se indicó en los comentarios, los caracteres Unicode \ u4E00- \ u9FA5 solo se asignan a la expresión anterior en la codificación UTF16-BE. La codificación UTF8 es probablemente diferente. Por lo tanto, debe analizar la asignación cuidadosamente y ver si puede encontrar una expresión de coincidencia de bytes para Ruby 1.8.

+0

La expresión regular que marcó como "no comprobada" ciertamente no es equivalente a [\ u4e00- \ u9FA5] cuando procesa texto UTF-8 con un motor de expresiones regulares de 8 bits como el de Ruby 1.8. Su expresión regular solo funcionará al procesar texto UTF-16BE con un motor de expresiones regulares de 8 bits. –

2

El motor de expresión regular Oniguruma tiene soporte adecuado para Unicode. Ruby 1.9 usa Oniguruma por defecto. Ruby 1.8 puede ser recompilado para usarlo.

Con Oniguruma puede usar la misma expresión regular que en PHP, incluido el modificador/u para obligar a Ruby a tratar la cadena como UTF-8.

3

Esto es lo que he hecho:

%r{^[#{"\344\270\200"}-#{"\351\277\277"}]+$} 

Ésta es básicamente una expresión regular con los valores octales que representan el rango de entre U + 4E00 y U + 9FFF, los caracteres chinos y japoneses más comunes.

Cuestiones relacionadas