[ruby] (‘가’..’힣’).each{|x| print x}

2008-05-14   //   alexken작성   //   기술  //  5 Comments

루비 공부 시작한지 다음날 문득
Unicode의 한글 영역을 전부 출력하는 프로그램을 ruby로 짜면 어떻게 될까 궁금해 졌다.

머리 속에서는 직관적으로

('가'..'힣').each{|x| print x}

란 코드가 떠 올랐다. 겁나 멋지다.
‘가’의 Unicode가 AC00인지 모르더라도 (‘힣’의 코드 값은 외우고 있지도 않다.) Range가 지원해주지 않을까?

다른 언어라면 분명 루프가 빙빙 돌고,
‘가’가 아닌 AC00부터 code값을 증가시키면서…. 어쩌구 저쩌구 하는 코드가 될터인데….

근데 안돈다.
더 정확히는 도는듯 하다 만다.

이유는 ruby String의 내부처리가 UTF-8이어서 그랬다.
이런 젠장….

UTF-8도 Unicode 인코딩 기법중 하나 맞고, 나름 장단이 있는 유니코드 인코딩이지만,
직렬화나, 네트웍 전송시에나 적합한 인코딩이고, 메모리 내부 처리는 UCS2나 하다 못해 UCS4로 처리함이 맞다고 본다.
그래야 기껏 Unicode에서 욕먹어 가면서 현대 한글 11072자 모두 할당 받아 한글 처리가 조합형처럼 처리가 가능하고, 한글 소팅 문제나…..
기타등등…(욕까진 안먹었나? 하지만 눈치 보면서…)

아마도 ASCII가 1byte로 인코딩되는 점 때문에 (영어권 프로그래머의…)힘에서 밀린듯 하다.

암튼 String succ메소드를 건드리고야 말았다.(별 바람직해 보이진 않지만…)

class String
  def succ
    head = self.unpack('U*')
    tail = head.pop
    return head.pack('U*') + [tail + 1].pack('U*')
  end
end

("가".."힣").each{|x| print x}
("あ".."ん").each{|x| print x}

#"가나다".each_char {|x| print x}
puts "가나다".succ
가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬
갭갮갯갰갱갲갳갴갵갶갷갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓걔걕걖걗걘걙
...
힟힠힡힢힣あぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとど
なにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん가나닥

가능성은 희박하겠지만, ruby 2.0에서는 제발 UCS2나 4로 String 내부처리가 바뀌었으면 하는 바람이다.