ruby unicode utf-8 internationalization multibyte

Ruby 1.9: ¿cómo puedo usar cadenas de multibyte en mayúsculas y minúsculas?



unicode utf-8 (3)

La conversión de casos depende de la configuración regional y no siempre de ida y vuelta, por lo que Ruby 1.9 no la cubre (ver here y here )

La joya Unicode-Util debe satisfacer sus necesidades.

Así que matz tomó la decisión de mantener upcase y downcase limitado a /[AZ]/i en ruby ​​1.9.1.

ActiveSupport::Multibyte tiempo, ActiveSupport::Multibyte ha tenido un gran caso de i18n en jigger en ruby ​​1.8.x a través de String#mb_chars .

Sin embargo, cuando se prueba bajo ruby ​​1.9.1, parece que no funciona. Aquí hay un script de prueba simple que escribí, junto con el resultado que obtengo:

$ cat test.rb # encoding: UTF-8 puts("@ #{RUBY_VERSION} " + (__ENCODING__ rescue $KCODE).to_s) sd, su = "Iñtërnâtiônàlizætiøn", "IÑTËRNÂTIÔNÀLIZÆTIØN" def ps(u, d, k); puts "%-30s: %24s / %-24s" % [k, u, d] end ps sd.upcase, su.downcase, "Plain ruby" require ''rubygems''; require ''active_support'' ps sd.upcase, su.downcase, "With active_support" ps sd.mb_chars.upcase.to_s, su.mb_chars.downcase.to_s, "With active_support mb_chars" $ ruby -KU test.rb @ 1.8.7 UTF8 Plain ruby : IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn With active_support : IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn With active_support mb_chars : IÑTËRNÂTIÔNÀLIZÆTIØN / iñtërnâtiônàlizætiøn $ ruby1.9 test.rb @ 1.9.1 UTF-8 Plain ruby : IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn With active_support : IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn With active_support mb_chars : IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn

Entonces, ¿cómo me upcase y downcase internacionalizado con ruby ​​1.9.1?

actualizar

Debo añadir que también probé con ActiveSupport desde el master actual, ramales 2-3 - 2-3-* y 3-0-unstable en GitHub. Mismos resultados


La conversión de casos es complicada y depende de la configuración regional. Afortunadamente, Martin Dürst agregó el mapeo completo de casos Unicode en Ruby 2.4:

puts RUBY_DESCRIPTION sd, su = "Iñtërnâtiônàlizætiøn", "IÑTËRNÂTIÔNÀLIZÆTIØN" def ps(u, d, k); puts "%-30s: %24s / %-24s" % [k, u, d] end ps sd.upcase, su.downcase, "Ruby 2.4 (default)" ps sd.upcase(:ascii), su.downcase(:ascii), "Ruby 2.4 (ascii)" ps sd.upcase(:turkic), su.downcase(:turkic), "Ruby 2.4 (turkic)" ps sd.upcase(:lithuanian), su.downcase(:lithuanian), "Ruby 2.4 (lithuanian)" ps "-", su.downcase(:fold), "Ruby 2.4 (fold)"

Salida:

ruby 2.4.0dev (2016-06-24 trunk 55499) [x86_64-linux] Ruby 2.4 (default) : IÑTËRNÂTIÔNÀLIZÆTIØN / iñtërnâtiônàlizætiøn Ruby 2.4 (ascii) : IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn Ruby 2.4 (turkic) : IÑTËRNÂTİÔNÀLİZÆTİØN / ıñtërnâtıônàlızætıøn Ruby 2.4 (lithuanian) : IÑTËRNÂTIÔNÀLIZÆTIØN / iñtërnâtiônàlizætiøn Ruby 2.4 (fold) : - / iñtërnâtiônàlizætiøn


para cualquiera que venga de google por ruby upcase utf8 :

> "your problem chars here çöğıü Iñtërnâtiônàlizætiøn".mb_chars.upcase.to_s => "YOUR PROBLEM CHARS HERE ÇÖĞIÜ IÑTËRNÂTIÔNÀLIZÆTIØN"

La solución es usar mb_chars