簡體   English   中英

將.capitalize應用於紅寶石中的西里爾陣列

[英]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

您可以使用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字符的區分大小寫”。

你可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM