Rails: как перевести неанглийскую строку в нижний регистр?

Как я мог в Ruby on Rails 3 убрать неанглийскую строку?

str = "Привет"    # Russian 
puts str[0].ord   # => 1055
str.downcase!
puts str[0].ord   # => 1055 (Should be 1087)

Я хочу, чтобы он работал как в Ruby 1.8.7, так и в Ruby 1.9.2.


person Misha Moroshko    schedule 11.09.2011    source источник
comment
Вы имеете в виду греческий или какой-нибудь неанглоязычный?   -  person Cydonia7    schedule 11.09.2011
comment
В настоящее время меня интересует русский язык, но, возможно, я захочу использовать другие языки в будущем, поэтому я ищу общее решение.   -  person Misha Moroshko    schedule 11.09.2011


Ответы (5)


Почему бы не использовать драгоценный камень unicode_utils. Этот гем не заставит downcase работать, однако вы можете использовать:

UnicodeUtils.downcase('Привет') #=> 'привет'
person Developer    schedule 09.03.2014

Если вы хотите использовать его так просто:

> "Привет".downcase
=> "привет"

вы должны поместить в папку инициализаторов файл string.rb

require 'unicode'

class String
  def downcase
    Unicode::downcase(self)
  end
  def downcase!
    self.replace downcase
  end
  def upcase
    Unicode::upcase(self)
  end
  def upcase!
    self.replace upcase
  end
  def capitalize
    Unicode::capitalize(self)
  end
  def capitalize!
    self.replace capitalize
  end
end
person Dima Melnik    schedule 10.12.2016

Начиная с Ruby 2.4 существует встроенное полное отображение регистра Unicode . Источник: https://stackoverflow.com/a/38016153/888294. Подробности см. В документации Ruby 2.4.0: https://ruby-doc.org/core-2.4.0/String.html#method-i-downcase

person mmichaa    schedule 18.09.2017

Хорошее и простое решение в рельсах - добавить string.rb в папку инициализаторов, затем в этом файле вы можете переопределить String с помощью mb_chars, теперь в нижнем регистре поддерживаются акценты и буквы, такие как Ñ

class String
  def downcase
    self.mb_chars.downcase.to_s
  end

  def capitalize
    self.mb_chars.capitalize.to_s
  end

  def upcase
    self.mb_chars.upcase.to_s
  end

  def titleize
    self.mb_chars.titleize.to_s
  end
end
person Jose Miguel Richard    schedule 08.07.2019

person    schedule
comment
Без рельсов вам понадобится дополнительная require 'active_support/core_ext', чтобы избежать ошибки undefined method - person knut; 26.07.2012
comment
круто, почему не исправили в рубине 2.0 :( - person Egor Malkevich; 22.08.2013
comment
mb_chars также работает с capitalize и upcase. Отличное решение! Мы также можем позвонить 'Привет'.mb_chars.downcase.wrapped_string - person Stepan Zakharov; 07.06.2016
comment
В Ruby 2.4 он, наконец, работает так, как ожидалось: "Привет".downcase #=> "привет" - person michau; 01.09.2016