Convertir espacios sin romper en espacios en Ruby

Tengo casos en los que los datos ingresados ​​por el usuario desde un área de texto o entrada html a veces se envían con \u00a0 (espacios sin interrupción) en lugar de espacios cuando se codifican como utf-8 json.

Creo que ser un error en Firefox, ya que sé que el usuario no está colocando intencionalmente espacios sin interrupciones en lugar de espacios.

También hay dos errores en Ruby, uno de los cuales puede usarse para combatir al otro.

Por alguna razón, \s no coincide con \u00a0 .

Sin embargo, [^[:print:]] , que definitivamente no debería coincidir) y \xC2\xA0 ambos coincidirán, pero considero que esas son formas menos que ideales para resolver el problema.

¿Existen otras recomendaciones para solucionar este problema?

Utilice /\u00a0/ para hacer coincidir los espacios que no se rompen. Por ejemplo, s.gsub(/\u00a0/, ' ') convierte todos los espacios de no s.gsub(/\u00a0/, ' ') espacios regulares.

Use /[[:space:]]/ para hacer coincidir todos los espacios en blanco, incluidos los espacios en blanco de Unicode como los espacios sin interrupciones. Esto es diferente a /\s/ , que coincide solo con los espacios en blanco ASCII.

Ver también: documentación de Ruby Regexp.

Si no puede usar \s para los espacios en blanco de Unicode, eso es un error en la implementación de Ruby regex, porque de acuerdo con el Anexo C “Expresiones Regulares de Unicode” de UTS # 18 , es absolutamente necesario que coincida con cualquier punto de código en blanco de Unicode.

No hay espacio de maniobra permitido ya que las dos columnas que detallan la Recomendación estándar y la Compatibilidad POSIX son las mismas para el caso. No puede documentar su manera de evitar esto: no cumple con el estándar de Unicode, en particular, con RL1.2a de UTS # 18, si no lo hace.

Si no cumple con RL1.2a, no cumple con los requisitos del Nivel 1, que son la funcionalidad más básica y elemental necesaria para usar expresiones regulares en Unicode. Sin eso, estás bastante perdido. Por eso existen las normas. Mi recuerdo es que Ruby tampoco cumple con otros requisitos del Nivel 1. Por lo tanto, es posible que desee utilizar un lenguaje de progtwigción que cumpla al menos con el Nivel 1 si realmente necesita manejar Unicode con expresiones regulares.

Tenga en cuenta que no puede usar una propiedad de Categoría General Unicode como \p{Zs} para representar \p{Whitespace} . Esto se debe a que la propiedad de espacio en blanco es una propiedad derivada, no una categoría general. También hay caracteres de control incluidos, no solo separadores.

Por alguna razón, s no coincide con \ u00a0.

Creo que la “razón que sea” es que no se supone que lo haga. Solo las clases de caracteres de construcción POSIX y \ p son conscientes de Unicode. Las abreviaturas de la clase de caracteres no son:

 Sequence As[...] Meaning \d [0-9] ASCII decimal digit character \D [^0-9] Any character except a digit \h [0-9a-fA-F] Hexadecimal digit character \H [^0-9a-fA-F] Any character except a hex digit \s [ \t\r\n\f] ASCII whitespace character \S [^ \t\r\n\f] Any character except whitespace \w [A-Za-z0-9\_] ASCII word character \W [^A-Za-z0-9\_] Any character except a word character 

Ejemplos reales de códigos IRB en funcionamiento que responden a la pregunta, con los últimos Rubies (mayo de 2012)

Ruby 1.9

 require 'rubygems' require 'nokogiri' RUBY_DESCRIPTION # => "ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]" doc = '   ' page = Nokogiri::HTML(doc) s = page.inner_text s.each_codepoint {|c| print c, ' ' } #=> 32 160 32 s.strip.each_codepoint {|c| print c, ' ' } #=> 160 s.gsub(/\s+/,'').each_codepoint {|c| print c, ' ' } #=> 160 s.gsub(/\u00A0/,'').strip.empty? #true 

Ruby 1.8

 require 'rubygems' require 'nokogiri' RUBY_DESCRIPTION # => "ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]" doc = '   ' page = Nokogiri::HTML(doc) s = page.inner_text # " \302\240 " s.gsub(/\s+/,'') # "\302\240" s.gsub(/\302\240/,'').strip.empty? #true 

Para las versiones anteriores de ruby ​​(1.8.x), las correcciones son las que se describen en la pregunta.

Esto se soluciona en las nuevas versiones de ruby ​​1.9+.

Si bien no está relacionado con Ruby (y no directamente con esta pregunta), el núcleo del problema podría ser que Alt + Space en Mac produzca un espacio sin interrupciones.

Esto puede causar todo tipo de comportamiento extraño (especialmente en el terminal).

Para aquellos que estén interesados ​​en obtener más detalles, escribí ” Por qué encadenar comandos con tuberías en Mac OS X no siempre funciona ” sobre este tema hace algún tiempo.

    Intereting Posts