다음은 Ruby/JRuby 에서 똑 같이 동작하는 문자열 거꾸로 하기 예제 코드이다.
영문은 잘 되지만, 한글은 잘 되지 않음을 알 수 있다. 이는 Ruby/JRuby가 한글이든 무엇이든 바이트 단위로 처리하기 때문이다.
a = "Hello, world!"
b = "안녕하세요?"
puts "%s --> %s" % [a, a.reverse()]
puts "%s --> %s" % [b, b.reverse()]
####################
# Expected:
# Hello, world! --> !dlrow ,olleH
# 안녕하세요? --> ?요세하녕안
# Result:
# Hello, world! --> !dlrow ,olleH
# 안녕하세요? --> ?岳세逑楹횡
####################
b = "안녕하세요?"
puts "%s --> %s" % [a, a.reverse()]
puts "%s --> %s" % [b, b.reverse()]
####################
# Expected:
# Hello, world! --> !dlrow ,olleH
# 안녕하세요? --> ?요세하녕안
# Result:
# Hello, world! --> !dlrow ,olleH
# 안녕하세요? --> ?岳세逑楹횡
####################
다음은 JRuby 에서 정상적으로 동작하는 코드이다.
Ruby 에서는 CP949로 되었지만, JRuby에서는 CP949로 되지 않고 MS949로만 된다.
require 'iconv'
# Expected:
# MS949: 안녕하세요? --> ?요세하녕안
# Result:
# MS949: 안녕하세요? --> ?요세하녕안
####################
korToUtf = Iconv.new('UTF-8', 'MS949')
utfToKor = Iconv.new('MS949', 'UTF-8')
s = "안녕하세요? 아햏햏"
arrS = korToUtf.iconv(s).unpack('U*')
arrT = arrS.reverse
t = utfToKor.iconv(arrT.pack("U*")) # "U" -> 1글자만 변환, "U*" -> 모두 변환
puts "%s: %s --> %s" % ["MS949", s, t]
# Expected:
# MS949: 안녕하세요? --> ?요세하녕안
# Result:
# MS949: 안녕하세요? --> ?요세하녕안
####################
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.