Ruby에서 로마 숫자 문자 (기종 종속 문자)를 알파벳으로 변환

5061 단어 유니코드루비

하고 싶은 일



예를 들어 ( U+2166 )를 VII로 변환하고 싶습니다.

방법



어리석은 방법


def replace_roman_numerals_with_alphabets(str)
  conversions = {
    'Ⅰ' => 'I', 'Ⅱ' => 'II', 'Ⅲ' => 'III', 'Ⅳ' => 'IV', 'Ⅴ' => 'V',
    'Ⅵ' => 'VI', 'Ⅶ' => 'VII', 'Ⅷ' => 'VIII', 'Ⅸ' => 'IX', 'Ⅹ' => 'X',
    'Ⅺ' => 'XI', 'Ⅻ' => 'XII'
  }.freeze

  str.gsub(/[#{conversions.keys}]/, conversions)
end

replace_roman_numerals_with_alphabets('ファイナルファンタジーⅦ')
#=> "ファイナルファンタジーVII"

변환 규칙을 직접 준비하는 것은 어렵습니다

똑똑한 방법


def replace_roman_numerals_with_alphabets(str)
  # Unicode の U+2160 から U+217F までがローマ数字。
  roman_numerals_pattern = /[\u2160-\u217F]/ 
  str.gsub(roman_numerals_pattern) { |char| char.unicode_normalize(:nfkd) }
end

replace_roman_numerals_with_alphabets('ファイナルファンタジーⅦ')
#=> "ファイナルファンタジーVII"

# ちなみに……
'ファイナルファンタジーⅦ'.unicode_normalize(:nfkd)
#=> "ファイナルファンタジーVII"

NFKD 형식(또는 NFKC 형식)으로 유니코드 정규화 하는 것으로, 대응하는 알파벳으로 분해할 수가 있다.

참고


  • [Wikipedia] 유니코드 정규화

  • [Ruby] String#gsub
  • 제 2 인수에 Hash 객체를 건네줄 수 있을까 블록 인수를 건네줄 수 있어 기용인 메소드.


  • [Qiita] Python 3에서 유니 코드에 관한 비망록
  • 졸 기사. 파이썬에서 유니 코드 정규화를 언급합니다.

  • 좋은 웹페이지 즐겨찾기