将.capitalize应用于红宝石中的西里尔阵列

时间:2016-12-23 12:19:20

标签: ruby capitalize

我想用ruby

来大写数组中的字符串元素

这是我的代码:

headermonths = ["января","февраля","марта","апреля","мая","июня","июля","августа","октября","ноября","декабря"]

headermonths.each {|month| month.capitalize!}
puts headermonths

我得到以下输出:

января
февраля
марта
апреля
мая
июня
июля
августа
октября
ноября
декабря

如果打印数组:

 print headermonths    

我得到以下

["\u044F\u043D\u0432\u0430\u0440\u044F", "\u0444\u0435\u0432\u0440\u0430\u043B\u044F", "\u043C\u0430\u0440\u0442\u0430", "\u0430\u043F\u0440\u0435\u043B\u044F", "\u043C\u0430\u044F", "\u0438\u044E\u043D\u044F", "\u0438\u044E\u043B\u044F", "\u0430\u0432\u0433\u0443\u0441\u0442\u0430", "\u043E\u043A\u0442\u044F\u0431\u0440\u044F", "\u043D\u043E\u044F\u0431\u0440\u044F", "\u0434\u0435\u043A\u0430\u0431\u0440\u044F"]

但我希望有一个输出:

Января Февраля Марта Апреля Мая Июня Июля Августа Октября Ноября Декабря

我如何使用ruby方法实现这一目标?

3 个答案:

答案 0 :(得分:2)

独立解决方案:

# From : https://en.wikipedia.org/wiki/Cyrillic_alphabets :
upcase   = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"
downcase = "абвгдежзийклмнопрстуфхцчшщьюя"

headermonths = ["января","февраля","марта","апреля","мая","июня","июля","августа","октября","ноября","декабря"]

headermonths.each{|word| word[0] = word[0].tr(downcase,upcase)}
# => ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Октября", "Ноября", "Декабря"]

如果你想在拉丁语和西里尔字母中使用单词:

headermonths.each{|word| word[0] = word[0].tr(downcase,upcase).upcase }

使用ActiveSupport

您可以使用ActiveSupport::Multibyte

require 'active_support/core_ext/string/multibyte'
"января".mb_chars.capitalize.to_s #=> "Января"

所以你的脚本变成了:

require 'active_support/core_ext/string/multibyte'

headermonths = ["января","февраля","марта","апреля","мая","июня","июля","августа","октября","ноября","декабря"]

headermonths.map!{|word| word.mb_chars.capitalize.to_s}
#=> ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Октября", "Ноября", "Декабря"]

Ruby 2.4

您的问题中的代码将与Ruby 2.4一样正常工作。

请参阅“unicode字符的区分大小写”here

答案 1 :(得分:2)

您可以使用unicode gem

require 'unicode'

headermonths = ["января","февраля","марта","апреля","мая","июня","июля","августа","октября","ноября","декабря"]

headermonths.map! {|month| Unicode::capitalize month }
puts headermonths
# >> ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Октября", "Ноября", "Декабря"]

答案 2 :(得分:1)

以下示例是一个强大的大写版本,适用于以1.9 开头的任何红宝石,但仅适用于-32硬编码的西里尔文。

NB :感谢和归功于@Stefan和@EricDuminil,他们引领我走向正确的方向

headermonths = %w|января февраля марта апреля мая июня
                  июля августа октября ноября декабря|
puts (headermonths.each do |s|
  s[0] = (s[0].ord - 32).chr(Encoding::UTF_8) 
end.inspect)
#⇒ ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня",
#   "Июля", "Августа", "Октября", "Ноября", "Декабря"]