【问题标题】:Ruby 1.9: how can I properly upcase & downcase multibyte strings?Ruby 1.9:如何正确大写和小写多字节字符串?
【发布时间】:2010-12-27 00:05:30
【问题描述】:

因此 matz 决定在 ruby​​ 1.9.1 中将 upcasedowncase 限制为 /[A-Z]/i

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

那么,如何使用 ruby​​ 1.9.1 国际化 upcasedowncase

更新

我应该补充一点,我还在 GitHub 的当前 master2-3-*3-0-unstable rails 分支中使用 ActiveSupport 进行了测试。结果相同。

【问题讨论】:

    标签: ruby unicode utf-8 internationalization multibyte


    【解决方案1】:

    对于来自 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

    文档:

    【讨论】:

    【解决方案2】:

    大小写转换取决于语言环境,并不总是往返,这就是为什么 Ruby 1.9 没有涵盖它(请参阅herehere

    unicode-util gem 应该可以满足您的需求。

    【讨论】:

    • 酷,他们甚至在自述文件中使用了臭名昭著的大写土耳其语 I 和一个点,这体现了您提到的语言环境依赖性。
    【解决方案3】:

    大小写转换很复杂并且取决于语言环境。幸运的是,Martin Dürst 在 Ruby 2.4 中添加了full Unicode case mapping

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2010-09-06
      • 2020-09-13
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2020-09-16
      相关资源
      最近更新 更多