Ruby의 소스코드 인코딩

루비로 코드를 작성할 때 한글을 입력하고, 실행을 하면 에러(invalid multibyte char (US-ASCII))가 발생한다. 2.0 이전의 루비는 다른 설정이 없으면 소스 코드의 인코딩을 ASCII라고 생각한다. 기본값이 US-ASCII이기 때문에 아스키 이외의 문자인 한글이 나오면 ‘얜 뭐야!’라는 에러를 뱉는 것이다.

hangul = "한글"
puts hangul

Magic Comment

소스 코드의 인코딩을 지정하는 방법이 있다. 이걸 Magic Comment라고 한다. 말 그대로 “마법 주석”이다. 주석이긴 한데 특별한 기능을 하기 때문에 마땅히 붙일 이름도 없어서 붙인듯 싶다. (신비한 것은 마법이다.)

알다시피 루비의 주석은 #으로 시작한다. “마법 주석”은 코드의 첫 줄만 적용된다. UNIX의 Shebang(파일의 첫 줄이 #!인 것)과 유사하다. 소스코드의 첫 줄이 # encoding: euc-kr면 소스 코드를 euc-kr로 읽게 된다. 물론 소스 파일을 저장할 때의 인코딩도 같아야 한다.

# encoding: euc-kr
puts "한글"

UTF-8이면 위에서 euc-kr 대신에 utf-8을 쓰면 된다.
shebang이 있는 경우에는 두번째 줄을 사용한다.

#!/usr/bin/ruby
# encoding: euc-kr
puts "한글"

이제 재밌는 것을 볼 차례다. 인코딩을 지정하는 Magic Comment는 여러가지 모양이 있다.

# encoding: utf-8
# coding: utf-8
# -*- coding: utf-8 -*-
# vim:set fileencoding=utf-8:

4가지 모두 가능하다. 세번째와 네번째는 각각 Emacs와 Vim에서 인코딩을 설정하는 모양이다. 그럼 다른 에디터는 어떻게 할까? 역시 Emacs와 Vim이 진리……
그래서 몇가지 실험을 했다.

# 루비 coding: utf-8
puts "한글"

어. 요거도 된다.

# 인코딩(encoding:utf-8)을 부탁해?!
puts "한글"

이것도 된다.

# coding: 인코딩 utf-8
puts "한글"

이건 안 된다.

주석에 coding:utf-8만 들어가 있으면 된다. 다른 문자는 모두 무시된다. coding과 콜론(:) 그리고 인코딩만 들어가 있으면 된다. 콜론 앞 뒤에 공백은 무시된다. 이래서 magic이 붙은 것인가?

RUBYOPT 설정

파일마다 마법 주석을 집어 넣기 귀찮다. 우리는 무조건 한글을 쓸 것이다. 이럴 때 쓰는 것이 RUBYOPT 환경변수다. RUBYOPT는 ruby를 실행 시에 추가되는 옵션을 지정해 둘 때 사용하는 환경변수다.
인코딩을 지정하는 옵션은 -K다. 왜 E가 아니고 K인가 메뉴얼을 보면 K는 인코딩을 정하는게 아니고 간지(KANJI)를 설정하는 옵션이다. 그래서 지정할 수 있는 인코딩이 별로 없다. e(EUC-JP), s(Windows-31J, CP932), u(UTF-8), n(ASCII-8BIT, Binary) 뿐이다. 보통 일본어를 쓸 일이 없으므로 단지 UTF-8을 지정 할 때 쓸 수 있다.
export RUBYOPT=-Ku를 실행하고 UTF-8 소스코드를 실행하면 잘 된다. 물론 ruby -Ku 명령을 사용해도 같다.
당연한 얘기겠지만 우선 순위는 파일 마다 지정할 수 있는 Magic Comment가 제일 높고 그 뒤에는 ruby의 -K 옵션을 사용하는 경우 그 다음이 RUBYOPT이다.

Shebang

소스 파일의 인코딩을 지정하지 않고, Shebang으로 실행하는 경우다. 예를들어

#!/usr/bin/ruby
puts "한글"

이렇게 하고 실행 권한을 주고, 실행을 바로(ruby를 앞에 붙이지 말고) 하면 에러 없이 실행 된다. 흐흠…. 잘은 모르겠지만 로케일이 작동하는 것 같다. 아님 말고, 여튼 된다.

Ruby 2.0

루비 2.0은 소스코드의 기본 인코딩이 UTF-8로 되는 것 같다. 역시 대세는 UTF-8!

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다