web-dev-qa-db-ja.com

Ruby 1.9:マルチバイト文字列を適切に大文字および小文字にするにはどうすればよいですか?

そのため、matzはupcasedowncase/[A-Z]/iに限定してRuby 1.9.1。

ActiveSupport::Multibyteは、長い間、Ruby 1.8.xを介してString#mb_charsを介してi18nのジガー処理を行ってきました。

ただし、Ruby 1.9.1の下で試した場合、動作しないようです。ここに私が書いた簡単なテストスクリプトと、取得した出力を示します。

$ 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

では、どのように国際化されたupcaseおよびdowncaseをRuby 1.9.1で)取得しますか?

更新

GitHubの現在のmaster2-3-*3-0-unstable Railsブランチ)からもActiveSupportでテストしたことを追加する必要があります。同じ結果が得られます。

55
kch

大文字と小文字の変換はロケールに依存し、常に往復するわけではないため、Ruby 1.9はそれをカバーしていません( ここ および ここを参照)

nicode-util gem でニーズに対応できます。

38

googleから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"

解決策はmb_chars

ドキュメンテーション:

57
destan

大文字と小文字の変換は複雑で、ロケールに依存します。さいわい、MartinDürstは 完全なUnicodeケースマッピング を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)"

出力:

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
12
J-_-L