Rails:如何小写非英文字符串?

Posted

技术标签:

【中文标题】Rails:如何小写非英文字符串?【英文标题】:Rails: How to downcase non-English string? 【发布时间】:2011-11-14 17:42:40 【问题描述】:

如何在 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 中工作。

【问题讨论】:

你的意思是希腊语还是任何一种非英语的? 目前我对俄语很感兴趣,但我以后可能想使用其他语言,所以我正在寻找一个通用的解决方案。 【参考方案1】:

Rails 中一个不错且简单的解决方案是将 string.rb 添加到初始化程序文件夹中,然后在此文件中您可以使用 mb_chars 覆盖 String,现在小写支持重音符号和字母,如 Ñ

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

【讨论】:

【参考方案2】:

从 Ruby 2.4 开始,有一个内置的 full Unicode case mapping。来源:https://***.com/a/38016153/888294。详见 Ruby 2.4.0 文档:https://ruby-doc.org/core-2.4.0/String.html#method-i-downcase

【讨论】:

【参考方案3】:

如果你想像这样简单地使用它:

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

你必须放入initializers文件夹文件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

【讨论】:

【参考方案4】:

为什么不使用 gem unicode_utils。这个 gem 不会强制 downcase 工作,但是你可以使用:

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

【讨论】:

【参考方案5】:
str = "Привет"
str.mb_chars.downcase.to_s
#=> "привет"

【讨论】:

如果没有rails,您需要一个额外的require 'active_support/core_ext' 以避免未定义的方法-错误 太棒了,为什么他们没有在 ruby​​ 2.0 中修复它:( mb_chars 也适用于capitalizeupcase。很好的解决方案!我们也可以拨打'Привет'.mb_chars.downcase.wrapped_string 在 Ruby 2.4 中,它最终按预期工作:"Привет".downcase #=> "привет"

以上是关于Rails:如何小写非英文字符串?的主要内容,如果未能解决你的问题,请参考以下文章

RFC 3986 中关于非英文字符的“不区分大小写”是啥意思?

如何搜索键盘上没有字符的字符串(非英语)?

rails

力扣784. 字母大小写全排列 回溯法 C++递归和非递归俩种实现非方式

如何使用 Rails / Friendly-Id 制作区分大小写的 URL?

不区分大小写的操作