Ruby 1.9 : 어떻게 오류 가류 및 다운 케이스 멀티 바이트 스트링을 올바르게 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1910573

문제

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

ActiveSupport::Multibyte 오랫동안 Ruby 1.8.x에서 큰 i18n 케이스 Jiggering을 사용했습니다. String#mb_chars.

그러나 Ruby 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과 함께?

업데이트

나는 또한 현재에서 Actives Upport로 테스트했다고 덧붙여 야합니다. master, 2-3-* 그리고 3-0-unstable github에서 레일 지점. 동일한 결과.

도움이 되었습니까?

해결책

케이스 변환은 로케일 의존적이며 항상 왕복하지는 않기 때문에 루비 1.9가 그것을 다루지 않는 이유입니다 ( 여기 그리고 여기)

그만큼 유니 코드 유틸 보석 귀하의 요구를 해결해야합니다.

다른 팁

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는 덧붙였다 전체 유니 코드 케이스 매핑 루비 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top