요즘 본격적으로 hbase, mapreduce 로 프로젝트를 수행중인데, 일부 프로그램은 python 스크립트로 짜서 소스를 그때 그때 수정할 수 있게 해야 하는 것이 생겼다. 이렇다 보니 jython을 사용하게 되었는데, 이거 우습게 봤다가 아주 낭패를 봤다. python 과 java 사이의 glue 역할을 하는 부분을 잘 모르니 java 와 jython 간의 내부 문자열 변환에서 상당히 애를 먹었다.
일단 jython의 기본 문자열은 python의 str 타입이다. java 는 당연히 java.lang.String 이고.
문제는 HBase 관련 api 를 호출하게 되면 이 녀석들의 반환 값이 byte[] 인 것이다. 요걸 jython 에서 사용하려면 일단 java.lang.String 으로 바꾼다.
import sys
import java.lang.String
:
value_from_hbase = some_function_using_hbase_api()
test = java.lang.String(value_from_hbase, encoding_of_byte_array)
print test
byte[] 형인 value_from_hbase 를 encoding_of_byte_array 인코딩으로 java.lang.String 객체를 만들었다. 여기까진 좋다.
요걸 그대로 print test 를 하면 한글이 깨져 출력된다.
한 단계를 더 거치도록 한다.
import sys
import java.lang.String
from org.python.core import PyString
:
value_from_hbase = some_function_using_hbase_api()
test = java.lang.String(value_from_hbase, encoding_of_byte_array)
test = PyString(test).encode(encoding_of_byte_array)
print test
이제 한글이 제대로 찍힐 것이다.