2010-09-16 103 views
96

upcase方法将整个字符串大写。用红宝石字母大写第一个字母

我只需要大写首字母。

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

我该怎么做?

+3

请注意,有些语言对首字母大写的字母有不同的看法。在爱尔兰语中,你做的事情是“我mBaileÁthaCliath”(“都柏林”中的) - 小写'm',大写'B'。 (见http://en.wikipedia.org/wiki/Consonant_mutation#Celtic_languages,如果你想知道为什么爱尔兰人会这样做,为什么它是有道理的。) – 2012-02-09 23:19:48

+2

同时请注意#capitalize会减少所有不是' t第一个字母......这并不总是你想要的。 '['space','UFO','NASA']。collect {| w | w.capitalize}#=> ['Space','Ufo','Nasa']' – Huliax 2015-11-09 20:03:25

回答

199

这取决于你使用Ruby版本。

红宝石2.4和更高

这只是工作,以来this version红宝石支持Unicode大小写映射。

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

红宝石2.3和更低

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

的问题是,它只是没有做你想要什么:它输出мария,而不是Мария

如果您使用的Rails有一个简单的解决方法:

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

做这项工作。

否则,您必须安装unicode宝石和使用它像这样:

require 'unicode' 

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

红宝石1.8

首先,一定要使用编码魔术评论:

#!/usr/bin/env ruby 

puts "мария".capitalize 

invalid multibyte char (US-ASCII),而:

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

puts "мария".capitalize 

作品没有错误,也看到红宝石2.3和更低节真正获利。

+1

它的工作原理!非常感谢 ! – AntonAL 2010-09-16 09:22:07

+0

登录只是为了表决你。好东西。 – 2012-09-23 11:14:22

+8

请注意,显然''我的API很棒'.capitalize'会产生'我的api很棒',这可能是不受欢迎的行为。 所以这个答案并没有真正回答这个问题,因为他只希望第一个字母变成大写字母而其他字母不变。 – 2016-07-29 16:18:33

1

使用capitalize。从docs

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

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

如果您想更改原始字符串,请仅使用感叹号。 – Magnar 2010-09-16 08:28:51

+0

* doh *谢谢,解决了我的错误。 – jhwist 2010-09-16 08:31:20

+5

-1。 OP *明确提到德语和俄语文本,这意味着非ASCII字符。 'String#upcase'(以及'String#downcase')仅为ASCII字符定义。 – 2010-09-16 11:47:53

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?换句话说:正确的大写需要一个完整的人工智能。

所以,与其有时还会提供错误的答案,红宝石选择有时给没有答案可言,这就是为什么非ASCII字符简单地获得downcase/upcase /资本运作忽略。 (这当然也读错误的结果,但至少它很容易检查。)

+4

对不起,但你的论证不成立。 Ruby选择不回答答案并不是真的,Ruby总是给出答案,这往往是错误的 - 例如, “мария”.upcase不应该返回“мария”,这在任何情况下都是不正确的。而关于人工智能需求的偏离根本就没有意义 - 没有任何东西可以阻止上升趋势,比如说'''''''',并且让调用者决定哪个大写是相关的在给定的情况下。目前,Ruby处理大写和小写之间的转换处理被破坏了,就是这样。 – michau 2012-11-11 03:12:16

+2

-1因为有一个大写[Eszett](https://en.wikipedia.org/wiki/Capital_%E1%BA%9E)。使用一些非完全形式化的区域不能作为解决方案的证据,仅适用于AI。 – Mike 2015-08-13 14:41:06

38

利用字符串的第一个单词的第一个字母

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

为每个字的第一个字母

在轨:

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

OR

"kirk_douglas".titleize 
=> "Kirk Douglas"  

在红宝石:

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

外轨,但仍然想要使用titleize方法

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

请注意,'capitalize'只能使用ASCII字符。 – infused 2014-07-12 07:06:56

+1

Upvote为纯Ruby解决方案。太懒了,以适当的方式开启Rails,并且这样做的伎俩:) – illbzo1 2015-09-21 16:58:14

12

好,只是让我们知道如何利用只有首字母和让其他人独自一人(因为有时候这就是所期望的)...

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

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

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

+0

谢谢你,我正在寻找的,有用的标题转换为'刑事案件' – lux 2017-09-23 11:12:16

1

您可以使用mb_chars。这方面umlaute:

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" 
3

由于积极支持和5.0.0.beta4您可以同时使用这两种方法之一的Rails:String#upcase_firstActiveSupport::Inflector#upcase_first。查看这个blog post了解更多信息。