[ruby] 루비에서 문자열의 첫 글자를 대문자로 쓰는 방법

upcase방법은 전체 문자열을 대문자로 표시하지만 첫 글자 만 대문자로 바꿔야합니다.

또한 독일어와 러시아어와 같은 몇 가지 인기있는 언어를 지원해야합니다.

어떻게합니까?



답변

사용하는 Ruby 버전에 따라 다릅니다.

루비 2.4 이상 :

Ruby v2.4.0 이 유니 코드 대소 문자 매핑을 지원하기 때문에 작동 합니다.

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

루비 2.3 이하 :

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

문제는 원하는 것을하지 않고 мария대신 출력 합니다 Мария.

Rails를 사용하는 경우 쉬운 해결 방법이 있습니다.

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

그렇지 않으면 유니 코드 젬 을 설치하고 다음과 같이 사용해야합니다.

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

오류없이 작동하지만 실제 대문자 사용에 대해서는 “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"

레일 외부에 있지만 여전히 titleize 메소드를 사용하려고합니다.

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


답변

불행히도, 기계가 제대로 대문자 / 소문자 / 자본을 작성하는 것은 불가능합니다. 컴퓨터가 이해하기에는 너무 많은 상황 정보가 필요합니다.

루비의 이유 String클래스는 ASCII 문자에 대한 대문자를 지원은 적어도이 있기 때문에, 어느 정도 잘 정의.

“컨텍스트 정보”란 무엇을 의미합니까?

예를 들어, 대문자를 i올바르게 사용하려면 텍스트의 언어가 무엇인지 알아야합니다. 예를 들어 영어 에는 점이없는 i대문자 와 점이있는 I작은 대문자 만 i있습니다. 그러나 터키어에는 점이없는 i자본 I, 점이있는 자본 İ, 점이 ı없는 작은 점, 점이있는 작은 4 개의 i점이 있습니다. 그래서 영어 'i'.upcase # => 'I'와 터키어로 'i'.upcase # => 'İ'. 다시 말해 'i'.upcase, 언어에 따라 두 가지 다른 결과를 반환 할 수 있기 때문에 언어를 몰라도 단어를 올바르게 대문자로 표기하는 것은 불가능합니다.

그러나 루비는 언어를 모르고 인코딩 만 알고 있습니다. 따라서 Ruby의 내장 기능으로 문자열을 올바르게 대문자로 지정할 수 없습니다.

언어 아는 경우 에도 대문자를 올바르게 사용하는 것이 불가능한 경우가 있습니다. 예를 들어 독일어에서 'Maße'.upcase # => 'MASSE'( Maße 는 복수의 Maß 의미 측정 )입니다. 그러나 'Masse'.upcase # => 'MASSE'( 질량을 의미 ). 그래서 무엇 'MASSE'.capitalize입니까? 다시 말해, 정확하게 대문자를 사용하려면 완전한 인공 지능이 필요합니다.

따라서 루비는 때때로 잘못된 대답을하는 대신 때때로 전혀 대답 하지 않기로하므로 ASCII가 아닌 문자는 소문자 / 대문자 / 자본 작업에서 무시됩니다. (물론 잘못된 결과를 읽지 만 확인하기는 쉽습니다.)


답변

글쎄, 우리는 첫 글자 만 대문자로하고 나머지는 그대로 두는 방법을 알고 있습니다. 때로는 그것이 바람직한 것입니다.

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

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

전화 capitalize하면 결과가됩니다 ["Nasa", "Mhz", "Sputnik"].


답변

레일 5+

Active Support 및 Rails 5.0.0.beta4부터 두 가지 방법 중 하나를 사용할 수 있습니다 : String#upcase_first또는 ActiveSupport::Inflector#upcase_first.

"my API is great".upcase_first #=> "My API is great"
"мария".upcase_first           #=> "Мария"
"мария".upcase_first           #=> "Мария"
"NASA".upcase_first            #=> "NASA"
"MHz".upcase_first             #=> "MHz"
"sputnik".upcase_first         #=> "Sputnik"

자세한 내용은 ” Rails 5 : New upcase_first Method “를 확인하십시오.


답변

사용하십시오 capitalize. 로부터 문자열 문서 :

첫 번째 문자가 대문자로 변환되고 나머지는 소문자로 변환 된 str의 사본을 리턴합니다.

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


답변

사용할 수 있습니다 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"