用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ße是Maß含义度量的复数)。 然而, '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_first
或ActiveSupport::Inflector#upcase_first
。 检查这个博客文章了解更多信息。