2010-09-16 156 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瞭解更多信息。

相關問題