예전에 써 둔 .sas 파일을 SAS 에서 열면 LIBNAME 이나 PROC 구문 안의 한글 주석·문자열이 깨져 보인다. 실행 결과의 한글이 깨지는 것과는 원인이 다르다. 여기서 깨지는 것은 데이터가 아니라 소스 파일 자체의 인코딩이다.
SAS 세션의 인코딩과 파일이 실제로 저장된 인코딩이 다르면 편집기가 잘못 해석한다. 한국어 환경에서 흔히 섞이는 조합은 다음 둘이다.
Windows 클라이언트에서 만든 옛 파일은 대개 CP949 이고, Viya 나 리눅스 쪽에서 내려받은 파일은 UTF-8 인 경우가 많다.
proc options option=encoding value;
run;
로그에 ENCODING=UTF8 또는 ENCODING=EUC-KR, ENCODING=WLATIN1 중 하나가 찍힌다.
리눅스에서는 다음으로 대강을 본다.
file -i old_program.sas
Windows 라면 메모장 이외의 편집기에서 현재 인코딩 표시를 본다. 깨진 글자를 CP949 로 다시 해석해 정상으로 보이면 파일이 CP949 다.
인코딩을 지정해 읽어 들이면 세션 설정을 건드리지 않고도 정상으로 처리된다.
filename src '/sasdata/old_program.sas' encoding='euc-kr';
%include src;
데이터 파일도 같은 방식이다.
filename in '/sasdata/input.csv' encoding='euc-kr';
data work.imported;
infile in dlm=',' dsd firstobs=2;
input name :$50. dept :$50.;
run;
앞으로도 계속 쓸 소스라면 아예 UTF-8 로 바꿔 두는 편이 낫다.
iconv -f CP949 -t UTF-8 old_program.sas -o old_program_utf8.sas
변환 뒤 원본은 지우지 말고 남겨 둔다. iconv 가 변환하지 못하는 문자가 있으면 그 자리에서 멈춘다. -c 를 주면 변환하지 못한 문자를 버리고 진행하는데, 무엇이 버려졌는지 확인하지 않은 채 쓰지 않는다.
구성 파일의 -ENCODING 값을 바꾸면 세션 기본 인코딩이 바뀐다. 리눅스에서는 로케일별 구성 파일이 따로 있다.
/opt/sas/SASHome/SASFoundation/9.4/nls/<로케일>/sasv9.cfg
Windows 는 실행 아이콘이 가리키는 -config 경로가 어느 로케일 디렉터리인지부터 확인한다. 이 부분은 SAS 9.4 설치와 한글 문제 에 정리돼 있다.
세션 인코딩을 바꾸면 기존에 만들어 둔 데이터셋의 인코딩과 어긋나 읽기 오류가 날 수 있다. 데이터셋까지 함께 옮겨야 하는 상황이면 SAS 9.4 에서 Viya 로 인코딩 이관 의 절차를 따른다.
Enterprise Guide 는 자체 편집기 인코딩을 따로 갖는다. 서버 세션이 UTF-8 이어도 EG 가 로컬에서 파일을 CP949 로 저장하면 서버에서 다시 깨진다.
세션 인코딩을 바꾼 뒤 기존 SAS 데이터셋을 읽을 때는 INENCODING= 를 준다.
libname old '/sasdata/old' inencoding='euc-kr';