upcase
方法将整个字符串大写。
我只需要把第一个字母大写。
另外,我需要支持几种流行语言,如德语和俄语。
我该怎么做?
答案 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ße是Maß的复数,意思是测量)。但是,'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_first
或ActiveSupport::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,upcase
,downcase
,capitalize
和swapcase
才适用于非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"