该upcase
方法将整个字符串大写.
我只需要把第一个字母大写.
另外,我需要支持几种流行语言,如德语和俄语.
我该怎么做?
这取决于您使用的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和更低的部分真正的大写.
大写字母第一个单词的第一个字母
"kirk douglas".capitalize #=> "Kirk douglas"
大写每个单词的第一个字母
在铁轨中:
"kirk douglas".titleize => "Kirk Douglas"
要么
"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
不幸的是,机器不可能正确地升级/缩小/大写.它需要太多的上下文信息才能让计算机理解.
这就是为什么Ruby的String
类只支持ASCII字符的大写,因为它至少有一定的定义.
"上下文信息"是什么意思?
例如,要i
正确地进行大写,您需要知道文本所使用的语言.例如,英语只有两个i
:大写I
没有点,小i
点有点.但土耳其有四个i
:资本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 /资本运作忽略.(当然这也会读取错误的结果,但至少它很容易检查.)
好吧,就这样我们知道如何只把第一个字母大写,剩下的就剩下了(因为有时这就是所希望的)......
['NASA', 'MHz', 'sputnik'].collect do |word| letters = word.split('') letters.first.upcase! letters.join end => ["NASA", "MHz", "Sputnik"]
调用#capitalize会导致 ["Nasa", "Mhz", "Sputnik"]