* 아래는 낮은 버전(1.8.6 이하)의 Ruby를 사용할 때 적용된다.

영문 문자열을 거꾸로 하기는 잘되지만,
한글 문자열을 거꾸로 하기는 잘 안된다.
그 이유는 Ruby가 모든 문자열을 바이트로 처리하기 때문이다.

예제 1.  한글 문자열을 잘 처리하지 못하는 예제

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
#   안녕하세요? --> ?岳세逑楹횡
####################



Ruby 언어(버전 1.8.6 이하)는 유니코드를 거의 지원하지 않는다.
그러나 iconv 를 이용하여 문자열 인코딩 변환하기는 가능하다.
다음은 EUC-KR 문자열을 UTF8 문자열로 변환하는 예이다.
'UTF8' 대신 'UTF8//IGNORE'로 한 것은 확장완성형 한글(예: 똠방, 아햏핼)을
변환하는 경우 발생하는 에러 Iconv::IllegalSequence를 예방하기 위함이다.

        require iconv

        #  양식 conv =  Iconv.new(encTarget, encSource)
        # EUC-KR 인코딩을 UTF-8 인코딩으로 변환하기
        conv =  Iconv.new('UTF-8//IGNORE', 'EUC-KR')

        s = "한글"
        t = conv.iconv(s)   # t는 변환된 문자열


예제 2. EUC-KR 한글 문자열을 잘 처리하지만, 확장완성형 한글을 잘 처리하지 못하는 예제

require 'iconv'

conv = Iconv.new('UTF-8//IGNORE', 'EUC-KR')
conv2 = Iconv.new('EUC-KR', 'UTF-8//IGNORE')

s = "안녕하세요? 아햏햏"
arrS = conv.iconv(s).unpack('U*')
arrT = arrS.reverse
t = conv2.iconv(arrT.pack("U*"))   # "U" -> 1글자만 변환, "U*"  -> 모두 변환
puts "%s --> %s" % [s, t]
####################
# Expected:
#   안녕하세요? 아햏햏 --> 햏햏아 ?요세하녕안
# Result:
#   안녕하세요? 아햏햏 --> dd아 ?요세하녕안
####################




예제 3 (최종). 확장완성형 한글도 잘 처리하는 예제 (문자셋 'EUC-KR' 대신 'CP949' 사용)

require 'iconv'

conv = Iconv.new('UTF-8//IGNORE', 'CP949')
conv2 = Iconv.new('CP949', 'UTF-8//IGNORE')

s = "안녕하세요? 아햏햏"
arrS = conv.iconv(s).unpack('U*')
arrT = arrS.reverse
t = conv2.iconv(arrT.pack("U*"))   # "U" -> 1글자만 변환, "U*"  -> 모두 변환
puts "%s --> %s" % [s, t]
####################
# Expected:
#   안녕하세요? 아햏햏 --> 햏햏아 ?요세하녕안
# Result:
#   안녕하세요? 아햏햏 --> 햏햏아 ?요세하녕안
####################





Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

 

Posted by Scripter
,