2009-10-26 10 views
12

Como parte de una serie más grande de operaciones, estoy tratando de tomar pedazos tokenizados de una cadena más grande y deshacerme de la puntuación, palabras sin sentido, etc. primer intento de utilizar String#gsub y la clase de caracteres \W expresión regular, así:Cadena de Ruby # caracteres gsub, unicode y sin palabra

my_str = "Hello," 
processed = my_str.gsub(/\W/,'') 
puts processed # => Hello 

super, super, super simple. Por supuesto, ahora estoy ampliando mi programa para tratar con caracteres no latinos, y todo se rompe. Ruby's \W parece ser algo así como [^A-Za-z0-9_], que, por supuesto, excluye cosas con signos diacríticos (ü, í, etc.). Por lo tanto, ahora mis ex-simples accidentes y quemaduras de código de forma desagradable:

my_str = "Quística." 
processed = my_str.gsub(/\W/,'') 
puts processed # => Qustica 

en cuenta que una gsub() amablemente eliminado el carácter "i" acentuado. Una forma en que pensé arreglar esto sería extender Ruby's \ W whitelist para incluir puntos de código Unicode más altos, pero hay una gran cantidad de ellos, y sé que extrañaré algunos y causaré problemas en el futuro (y ni siquiera comencemos a pensar en idiomas no latinos ...). Otra solución sería poner en lista negra todas las cosas que quiero eliminar (puntuación, $ /%/&/™, etc.), pero, una vez más, hay una gran cantidad de eso y yo realmente no quiero comienza a jugar blacklist-whack-a-mole.

¿Alguien ha encontrado una solución de principio para este problema? ¿Hay alguna versión oculta, compatible con Unicode de \W que aún no haya descubierto? ¡Gracias!

Respuesta

12

Debe ejecutar ruby ​​con la opción "-Ku" para que use UTF-8. Consulte la documentación para command-line options. Esto es lo que sucede cuando hago esto con irb:

% irb -Ku 
irb(main):001:0> my_str = "Quística." 
=> "Quística." 
irb(main):002:0> processed = my_str.gsub(/\W/,'') 
=> "Quística" 
irb(main):003:0> 

¡También puede ponerlo en el #! línea en el script Ruby:

#!/usr/bin/ruby -Ku 
+0

Gah. Pensé que ya estaba en el modo UTF-8. Eso soluciona las cosas, gracias por la ayuda! –

4

me gustaría añadir que en 1.9.1 funciona por defecto.

$ irb 
ruby-1.9.1-p243 > my_str = "Quística." 
=> "Quística." 
ruby-1.9.1-p243 > processed = my_str.gsub(/\W/,'') 
=> "Quística" 
ruby-1.9.1-p243 > processed.encoding 
=> #<Encoding:UTF-8> 

PS. Nada es mejor que rvm para probar diferentes versiones de Ruby. DS.

+0

Ooooh, eso es ciertamente agradable de ver. Aún no llegué a jugar con 1.9, pero estoy contento de ver que soluciona algunos de los caprichos de codificación de caracteres de 1.8. –

+0

No solo se dirige a algunos de ellos, sino que se ocupa de todos ellos. Y todos los de Java, C++, Python, PHP, ... también. El sistema de codificación de Ruby 1.9 es probablemente el más potente y más completo, con la posible excepción de solo ELisp. También * se ve * increíblemente complicado, pero eso se debe a que la codificación * es * complicada. La codificación de Java puede * verse * más simple, pero ¿alguna vez has visto una pieza moderadamente compleja de Java que realmente * usa * 'String'? No, todos los analizadores sintácticos, decodificadores, compiladores, motores Regexp, bibliotecas XML realmente usan 'byte []', exactamente * porque * 'String' es demasiado simplista. –

+3

Bueno, definitivamente tendré que echarle un vistazo pronto, entonces. Te lo juro, si pudiera cambiar, digamos, un riñón por no tener que lidiar con otro problema de codificación de caracteres por el resto de mi vida, podría considerar el trato. Quiero decir, olvidar todos los problemas de codificación realmente grandes y complicados, solo teniendo en cuenta los pequeños estúpidos como el que describí en la pregunta original, ¿cuántas horas colectivas de nuestras vidas hemos perdido tratando con esta mierda? Te lo diré: Way. También. Muchos. –

Cuestiones relacionadas