56 votes

Ruby 1.9: comment puis-je mettre correctement en place des chaînes multi-octets?

Donc matz a pris la décision de conserver upcase et downcase limitée à /[A-Z]/i en ruby 1.9.1.

ActiveSupport::Multibyte a longtemps eu une grande i18n cas jiggering en ruby 1.8.x via String#mb_chars.

Cependant, lorsqu'on l'a essayé en vertu de ruby 1.9.1, il ne semble pas fonctionner. Voici un test simple script que j'ai écrit, avec la sortie j'obtiens:

$ 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

Alors, comment puis-je obtenir internationalisés upcase et downcase avec ruby 1.9.1?

mise à jour

Je dois ajouter que j'ai aussi testé avec ActiveSupport de l'actuel master, 2-3-* et 3-0-unstable rails de branches sur GitHub. Mêmes résultats.

58voto

destan Points 943

pour toute personne venant de google de 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 solution consiste à utiliser mb_chars

39voto

Marc-André Lafortune Points 34140

La conversion de casse dépend des paramètres régionaux et ne s'effectue pas toujours aller-retour, raison pour laquelle Ruby 1.9 ne le couvre pas (voir ici et ici )

Le joyau unicode-util devrait répondre à vos besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X