[英]Apply .capitalize on an Cyrillic array in ruby
我想用ruby来大写数组中的字符串元素
这是我的代码:
headermonths = ["января","февраля","марта","апреля","мая","июня","июля","августа","октября","ноября","декабря"]
headermonths.each {|month| month.capitalize!}
puts headermonths
我得到以下输出:
января
февраля
марта
апреля
мая
июня
июля
августа
октября
ноября
декабря
如果打印数组:
print headermonths
我得到以下内容
["\я\н\в\а\р\я", "\ф\е\в\р\а\л\я", "\м\а\р\т\а", "\а\п\р\е\л\я", "\м\а\я", "\и\ю\н\я", "\и\ю\л\я", "\а\в\г\у\с\т\а", "\о\к\т\я\б\р\я", "\н\о\я\б\р\я", "\д\е\к\а\б\р\я"]
但是我希望有一个输出:
Января Февраля Марта Апреля Мая Июня Июля Августа Октября Ноября Декабря
我如何用ruby方法实现这一目标?
# 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 :: 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一样正常工作。
请参阅此处的 “unicode字符的区分大小写”。
你可以使用unicode gem
require 'unicode'
headermonths = ["января","февраля","марта","апреля","мая","июня","июля","августа","октября","ноября","декабря"]
headermonths.map! {|month| Unicode::capitalize month }
puts headermonths
# >> ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Октября", "Ноября", "Декабря"]
下面的示例是一个强大的大写版本,适用于以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)
#⇒ ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня",
# "Июля", "Августа", "Октября", "Ноября", "Декабря"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.