代码之家  ›  专栏  ›  技术社区  ›  kch

Ruby1.9:如何正确地对多字节字符串进行upcase和downcase操作?

  •  55
  • kch  · 技术社区  · 15 年前

    所以Matz决定 upcase downcase 仅限于 /[A-Z]/i 在红宝石1.9.

    ActiveSupport::Multibyte 在Ruby1.8.x.via中有很好的I18N案例Jiggering String#mb_chars .

    但是,当在Ruby1.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
    

    那么,我怎样才能国际化呢? 机箱 小写字母 使用Ruby 1.9.1?

    更新

    我应该补充一点,我也用当前的ActiveSupport进行了测试 master , 2-3-* 3-0-unstable 轨道在Github分支。同样的结果。

    3 回复  |  直到 8 年前
        1
  •  38
  •   Marc-André Lafortune    15 年前

    案例转换依赖于区域设置,并不总是往返的,这就是Ruby1.9没有覆盖它的原因(请参见 here here )

    这个 unicode-util gem 应该满足你的需要。

        2
  •  57
  •   destan    11 年前

    任何来自谷歌的人 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

        3
  •  12
  •   Jordan Running    8 年前

    案例转换很复杂,而且依赖于区域设置。幸运的是,Martin D_¼RST补充道 full Unicode case mapping 在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