2바이트 유니코드 문자(한, 중, 일 언어) 처리의 예
우리가 IDL에서 문자값을 다루는데 있어서 주로 영문을 다루는 것이 일반적이긴 하지만, 사실 한국어, 일어, 중국어와 같은 2바이트 유니코드 문자들도 IDL에서 얼마든지 인식 및 처리가 가능합니다. 예제로 적어놓으신 텍스트의 내용을 담은 원본 텍스트 파일이 있을텐데요. 이 파일로부터 한 줄씩 내용을 읽어서 처리해야 합니다. 일단 첫번째 줄만 읽어서 처리를 해본다고 하면, 다음과 같은 방식의 작업이 이루어져야 합니다. 이 내용에 대한 자세한 설명은 생략하겠습니다. 여기서 사용된 예제 텍스트 파일은 ascii_korean.txt라는 제가 그냥 임의로 만든 파일이고, 그 안에는 다음과 같은 내용이 들어가 있습니다.
2013년 8월 1일 ABC이상우
2013년 8월 2일 DEF이종혁
2013년 8월 3일 GHI이재희
ifile = 'ascii_korean.txt'
nl = FILE_LINES(ifile); 파일내 줄 수 확인
OPENR, lun, ifile, /GET_LUN
ss = ''
READF, lun, ss
그래서 이 파일의 첫번째 줄의 내용은 보면 다음과 같이 되어 있기 때문에, 위와 같은 과정을 통하여 ss라는 변수에는 다음과 같은 내용의 문자값이 들어가게 됩니다.
2013년 8월 1일 ABC이상우
여기서 중간중간에 공백(space)이 존재하는데 이를 마디로 삼아서 분리해내는 작업은 다음과 같이 STRSPLIT 함수를 사용합니다.
spl = STRSPLIT(ss, ' ', /EXTRACT)
HELP, spl
여기서 HELP의 결과를 보면 spl은 4개의 문자값들을 갖는 배열이 됩니다. 즉, 공백으로 나눠진 마디마디의 문자값들을 담고 있으므로, 네번째 값인 spl[3]을 출력해보라고 하면 다음과 같이 네번째 마디의 문자값을 출력할겁니다.
PRINT, spl[3]
ABC이상우
여기서 이 문자값의 맨 마지막 부분의 '이상우'라고 된 문자만 따로 추출하려면 STRMID 함수를 다음과 같이 사용합니다.
extr = STRMID(spl[3], 3)
여기서는 spl[0]라는 문자에 대하여 16번째(인덱스로는 15)부터 끝까지의 문자들을 모두 뽑아내라는 의미입니다. 물론 16번째부터 몇 글자를 뽑아내라는 의미의 추가인자를 줄 수도 있습니다. 그런데 이 '몇 글자'라는 의미가 영문일 경우에는 스펠 하나당 한 개로 간주되지만, 2바이트 유니코드 언어의 경우에는 스펠 하나당 3개로 간주가 되는 것 같습니다. 그래서 이 추가인자를 사용해서 추출할 경우에는 다음과 같이 적어줘야 합니다.
extr = STRMID(spl[0], 3, 9)
PRINT, extra
이상우
결국 이와 같이 추출된 extr이라는 문자값에 대하여 IF문을 사용하여 원하는 처리를 하면 됩니다. 예를 들면 다음과 같은 처리도 가능하겠죠.
IF extr EQ '이상우' THEN PRINT, 'OK'
OK
이 내용은 한 줄을 처리할 경우인데, 만약 여러 줄을 한꺼번에 처리하려면 nl만큼 반복을 수행하는 반복문이 사용이 되어야 합니다. 그리고 처리가 다 끝난 후에는 파일을 읽기 위하여 열었던 슬롯번호는 닫아줘야 함을 잊지 말아야 합니다.
FREE_LUN, lun
이 내용은 사실 얼마전에 IDL/ENVI 유저그룹 게시판에 올라왔던 질문을 토대로 한 것입니다. 그 질문에서는 일본어가 들어간 텍스트 파일이 대상이었는데요. 스펠 하나당 글자수를 3개로 인식하는 것은 한국어나 일본어 다 마찬가지인 것으로 확인이 됩니다. 중국어는 확인을 못해봤습니다. 이건 다음과 같이 STRLEN 함수를 사용해서 간단하게 확인이 됩니다.
PRINT, STRLEN('이상우')
9
어쨌든 이와 같은 방식으로 2바이트 유니코드 언어로 된 문자값에 대한 처리도 가능함을 참조하시면 좋겠습니다. 여기서 예제로 사용된 텍스트 파일 및 코드를 아래에 첨부합니다.