将首字母大写在红宝石中

时间:2010-09-16 08:24:21

标签: ruby

upcase方法将整个字符串大写。

我只需要把第一个字母大写。

另外,我需要支持几种流行语言,如德语和俄语。

我该怎么做?

9 个答案:

答案 0 :(得分:240)

这取决于您使用的Ruby版本。

Ruby 2.4及更高版本

它正常工作,因为this version ruby​​支持Unicode案例映射。

"мария".capitalize #=> Мария

Ruby 2.3及更低版本

"maria".capitalize #=> "Maria"
"мария".capitalize #=> мария

问题是,它只是没有按照您的意愿执行:它输出мария而不是Мария

如果你正在使用Rails,那么就有一个简单的解决方法:

"мария".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte

完成这项工作。

否则,你必须安装unicode gem并像这样使用它:

require 'unicode'

Unicode::capitalize("мария") #=> Мария

Ruby 1.8

首先,请务必使用编码魔术评论:

#!/usr/bin/env ruby

puts "мария".capitalize

给出invalid multibyte char (US-ASCII),而:

#!/usr/bin/env ruby
#coding: utf-8

puts "мария".capitalize

可以正常工作,但也可以看到 Ruby 2.3及更低部分以获得真正的大写。

答案 1 :(得分:50)

将字符串第一个字的首字母大写

"kirk douglas".capitalize
#=> "Kirk douglas"

将每个单词的首字母大写

在rails中:

"kirk douglas".titleize
=> "Kirk Douglas"

OR

"kirk_douglas".titleize
=> "Kirk Douglas"    

在红宝石中:

"kirk douglas".split(/ |\_|\-/).map(&:capitalize).join(" ") 
#=> "Kirk Douglas"

在rails之外,但仍想使用titleize方法

require 'active_support/core_ext'
"kirk douglas".titleize #or capitalize

答案 2 :(得分:18)

不幸的是,机器不可能正确地升级/缩小/大写。它需要太多的上下文信息才能让计算机理解。

这就是为什么Ruby的String类仅支持ASCII字符的大写,因为它至少有点定义良好。

“上下文信息”是什么意思?

例如,要正确地将i大写,您需要知道文本所使用的语言。例如,英语只有两个i s:大写I没有点带点的小i。但土耳其语有四个i s:大写I没有点,大写İ带点,小ı没有点,小i带点。因此,请使用英语'i'.upcase # => 'I'和土耳其语'i'.upcase # => 'İ'。换句话说:由于'i'.upcase可以返回两种不同的结果,这取决于语言,显然不可能在不知道其语言的情况下正确地对单词进行大写。

但是Ruby不知道语言,它只知道编码。因此,使用Ruby的内置功能无法正确地大写字符串。

情况变得更糟:即使 知道语言,有时也无法正确地进行大写。例如,在德语中,'Maße'.upcase # => 'MASSE'MaßeMaß的复数,意思是测量)。但是,'Masse'.upcase # => 'MASSE'(意为质量)。那么,'MASSE'.capitalize是什么?换句话说:正确的资本化需要一个完整的人工智能。

因此,Ruby选择有时不给出的答案,而不是有时给出错误的答案,这就是为什么非字符字符在downcase / upcase / capitalize操作中被忽略的原因。 (这当然也会读取错误的结果,但至少它很容易检查。)

答案 3 :(得分:14)

好吧,我们知道如何只把第一个字母大写,而只剩下其余的那些(因为有时这就是所希望的)......

['NASA', 'MHz', 'sputnik'].collect do |word|
  letters = word.split('')
  letters.first.upcase!
  letters.join
end

 => ["NASA", "MHz", "Sputnik"]

调用#capitalize会导致["Nasa", "Mhz", "Sputnik"]

答案 4 :(得分:4)

从Active Support和Rails 5.0.0.beta4开始,您可以使用以下两种方法之一:String#upcase_firstActiveSupport::Inflector#upcase_first。请查看此blog post了解详情。

答案 5 :(得分:2)

使用capitalize。来自docs

  

返回str的副本,第一个字符转换为大写,余数为小写。

      "hello".capitalize    #=> "Hello"
      "HELLO".capitalize    #=> "Hello"
      "123ABC".capitalize   #=> "123abc"

答案 6 :(得分:1)

您可以使用mb_chars。这尊重变音:

class String

  # Only capitalize first letter of a string
  def capitalize_first
    self[0] = self[0].mb_chars.upcase
    self
  end

end

示例:

"ümlaute".capitalize_first
#=> "Ümlaute"

答案 7 :(得分:1)

我的版本:

class String
    def upcase_first
        return self if empty?
        dup.tap {|s| s[0] = s[0].upcase }
    end
    def upcase_first!
        replace upcase_first
    end
end

['NASA title', 'MHz', 'sputnik'].map &:upcase_first  #=> ["NASA title", "MHz", "Sputnik"]

也请检查:
https://www.rubydoc.info/gems/activesupport/5.0.0.1/String%3Aupcase_first
https://www.rubydoc.info/gems/activesupport/5.0.0.1/ActiveSupport/Inflector#upcase_first-instance_method

答案 8 :(得分:0)

下面是另一种大写字符串中每个单词的方法。 \w与西里尔字母或拉丁字母与变音符号不匹配,但[[:word:]]与之匹配。直到2016年发布的Ruby 2.4.0,upcasedowncasecapitalizeswapcase才适用于非ASCII字符。

"aAa-BBB ä мария _a a_a".gsub(/\w+/,&:capitalize)
=> "Aaa-Bbb ä мария _a A_a"
"aAa-BBB ä мария _a a_a".gsub(/[[:word:]]+/,&:capitalize)
=> "Aaa-Bbb Ä Мария _a A_a"

[[:word:]]匹配以下类别的字符:

Ll (Letter, Lowercase)
Lu (Letter, Uppercase)
Lt (Letter, Titlecase)
Lo (Letter, Other)
Lm (Letter, Modifier)
Nd (Number, Decimal Digit)
Pc (Punctuation, Connector)

[[:word:]]匹配“标点,连接器”(Pc)类别中的所有10个字符:

005F _ LOW LINE
203F ‿ UNDERTIE
2040 ⁀ CHARACTER TIE
2054 ⁔ INVERTED UNDERTIE
FE33 ︳ PRESENTATION FORM FOR VERTICAL LOW LINE
FE34 ︴ PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
FE4D ﹍ DASHED LOW LINE
FE4E ﹎ CENTRELINE LOW LINE
FE4F ﹏ WAVY LOW LINE
FF3F _ FULLWIDTH LOW LINE

这是仅将字符串的第一个字符转换为大写的另一种方法:

"striNG".sub(/./,&:upcase)
=> "StriNG"