IT박스

Ruby 1.9 : 멀티 바이트 문자열을 올바르게 업 케이스 및 다운 케이스하려면 어떻게해야합니까?

itboxs 2021. 1. 7. 07:46
반응형

Ruby 1.9 : 멀티 바이트 문자열을 올바르게 업 케이스 및 다운 케이스하려면 어떻게해야합니까?


그래서 matz는 루비 1.9.1 을 유지 upcase하고 downcase제한하기 /[A-Z]/i결정했습니다 .

ActiveSupport::Multibyte오랫동안 루비 1.8.x에서 String#mb_chars.

그러나 루비 1.9.1에서 시도했을 때 작동하지 않는 것 같습니다. 다음은 내가 작성한 출력과 함께 작성한 간단한 테스트 스크립트입니다.

$ cat test.rb
# encoding: UTF-8

puts("@ #{RUBY_VERSION} " + (__ENCODING__ rescue $KCODE).to_s)
sd, su = "Iñtërnâtiônàlizætiøn", "IÑTËRNÂTIÔNÀLIZÆTIØN"
def ps(u, d, k); puts "%-30s:  %24s / %-24s" % [k, u, d] end
ps sd.upcase, su.downcase, "Plain ruby"

require 'rubygems'; require 'active_support'
ps sd.upcase, su.downcase, "With active_support"
ps sd.mb_chars.upcase.to_s, su.mb_chars.downcase.to_s, "With active_support mb_chars"

$ ruby -KU test.rb
@ 1.8.7 UTF8
Plain ruby                    :  IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn
With active_support           :  IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn
With active_support mb_chars  :  IÑTËRNÂTIÔNÀLIZÆTIØN / iñtërnâtiônàlizætiøn

$ ruby1.9 test.rb
@ 1.9.1 UTF-8
Plain ruby                    :      IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn
With active_support           :      IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn
With active_support mb_chars  :      IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn

그렇다면 어떻게 국제화 upcase되고 downcase루비 1.9.1을 사용합니까?

최신 정보

나는 또한 현재에서 ActiveSupport 테스트 것을 추가해야합니다 master, 2-3-*그리고 3-0-unstableGitHub의에서 가지를 레일. 같은 결과.


대소 문자 변환은 로케일에 따라 다르며 항상 왕복하지 않으므로 Ruby 1.9에서는이를 다루지 않습니다 ( 여기여기 참조 ).

유니 코드 - UTIL 보석은 당신의 요구를 충족해야한다.


Google에서 오는 모든 사용자 ruby upcase utf8:

> "your problem chars here çöğıü Iñtërnâtiônàlizætiøn".mb_chars.upcase.to_s
=> "YOUR PROBLEM CHARS HERE ÇÖĞIÜ IÑTËRNÂTIÔNÀLIZÆTIØN"

해결책은 mb_chars.

선적 서류 비치:


대소 문자 변환은 복잡하고 로케일에 따라 다릅니다. 다행히 Martin Dürst 는 Ruby 2.4에 전체 유니 코드 대소 문자 매핑추가했습니다 .

puts RUBY_DESCRIPTION

sd, su = "Iñtërnâtiônàlizætiøn", "IÑTËRNÂTIÔNÀLIZÆTIØN"
def ps(u, d, k); puts "%-30s:  %24s / %-24s" % [k, u, d] end 
ps sd.upcase,              su.downcase,              "Ruby 2.4 (default)"
ps sd.upcase(:ascii),      su.downcase(:ascii),      "Ruby 2.4 (ascii)"
ps sd.upcase(:turkic),     su.downcase(:turkic),     "Ruby 2.4 (turkic)"
ps sd.upcase(:lithuanian), su.downcase(:lithuanian), "Ruby 2.4 (lithuanian)"
ps "-",                    su.downcase(:fold),       "Ruby 2.4 (fold)"

산출:

ruby 2.4.0dev (2016-06-24 trunk 55499) [x86_64-linux]
Ruby 2.4 (default)            :      IÑTËRNÂTIÔNÀLIZÆTIØN / iñtërnâtiônàlizætiøn
Ruby 2.4 (ascii)              :      IñTëRNâTIôNàLIZæTIøN / iÑtËrnÂtiÔnÀlizÆtiØn
Ruby 2.4 (turkic)             :      IÑTËRNÂTİÔNÀLİZÆTİØN / ıñtërnâtıônàlızætıøn
Ruby 2.4 (lithuanian)         :      IÑTËRNÂTIÔNÀLIZÆTIØN / iñtërnâtiônàlizætiøn
Ruby 2.4 (fold)               :                         - / iñtërnâtiônàlizætiøn

참조 URL : https://stackoverflow.com/questions/1910573/ruby-1-9-how-can-i-properly-upcase-downcase-multibyte-strings

반응형