Ruby 1.9 : 어떻게 오류 가류 및 다운 케이스 멀티 바이트 스트링을 올바르게 할 수 있습니까?
-
19-09-2019 - |
문제
그래서 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
제휴하지 않습니다 StackOverflow