用ruby首字母大写

upcase方法大写整个string。

我只需要首字母大写。

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

我该怎么做?

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

Ruby 2.4及更高版本

它只是工作,因为这个版本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和更低的部分实际大写。

大写string的第一个字的第一个字母

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

大写每个单词的第一个字母

在导轨中:

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

要么

 "kirk_douglas".titleize => "Kirk Douglas" 

在ruby:

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

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

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

不幸的是,一台机器不可能正确地加/减/大写。 它需要太多的上下文信息来让计算机理解。

这就是为什么Ruby的String类只支持ASCII字符的大写字母,因为它至less有一定的定义。

“情境信息”是什么意思?

例如,为了正确使用i ,你需要知道文本是哪一种语言。例如,英文只有两个i :大写I没有一个点,小i有一个点。 但土耳其有四个i :首都I没有一个点,首都İ有点,小ı没有点,小i有点。 所以,用英文'i'.upcase # => 'I'和土耳其语'i'.upcase # => 'İ' 。 换句话说,由于'i'.upcase可以返回两个不同的结果,这取决于语言,显然不可能不知道它的语言正确大写一个词。

但是Ruby不知道这个语言,只知道编码。 因此,使用Ruby的内置function来正确地大写string是不可能的。

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

所以Ruby并不是有时会给出错误的答案,而是有时候根本没有给出答案,这就是为什么非ASCII字符在downcase / upcase / capitalize操作中被忽略的原因。 (当然这也读错误的结果,但至less很容易检查。)

那么,就这样我们知道如何只利用第一个字母,并把其余的单独留下 (因为有时候这就是所期望的)。

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

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

使用capitalize 。 从文档 :

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

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

你可以使用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" 

从Active Support和Rails 5.0.0.beta4开始,您可以使用以下两种方法之一: String#upcase_firstActiveSupport::Inflector#upcase_first 。 检查这个博客文章了解更多信息。