* 아래는 낮은 버전(1.8.6 이하)의 Ruby를 사용할 때 적용된다.
영문 문자열을 거꾸로 하기는 잘되지만,
한글 문자열을 거꾸로 하기는 잘 안된다.
그 이유는 Ruby가 모든 문자열을 바이트로 처리하기 때문이다.
예제 1. 한글 문자열을 잘 처리하지 못하는 예제
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' 사용)
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:
# 안녕하세요? 아햏햏 --> 햏햏아 ?요세하녕안
####################
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Ruby' 카테고리의 다른 글
Pollard's rho method 소개: 정수의 인수분해(factorizing integers) with Ruby (0) | 2009.03.24 |
---|---|
손으로 계산하는 긴자리 곱셈표 만들기 with Ruby (0) | 2009.03.06 |
손으로 만드는 나눗셈 계산표 with Ruby (0) | 2008.05.16 |
클래스 상속(subclassing) 예제 with Ruby (0) | 2008.04.05 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Ruby (0) | 2008.04.05 |