CFFTP태그는 손쉽게 ColdFusion 문서에서 외부의 FTP서버에 연결해서 해당 내용을 가져오거나 파일을 업로드하거나, 다운로드할 수 있는 아주 유용한 태그입니다. 마치 ColdFusion웹문서가 FTP클라이언트처럼 작동하게 해주는 강력한 기능을 제공합니다. 사용방법도 너무 쉬워서 몇줄의 코드로 간단하게 구현할 수 있습니다.
그런데 ASP와 같은 Windows계열의 웹개발언어에서는 CP949와 같은 운영체제의 인코딩과 EUC-KR과 같은 웹페이지 인코딩으로 기본적으로 한글을 사용하기에 매우 편리합니다만, 웹개발시 한글과 영문외의 문자 가령, 일본어 등과 같은 경우엔 별도의 조치를 취해주어야 합니다.
반면 대부분의 Linux환경에서는 UTF-8을 기본 지원하고 있어서 특별히 문자열에 대한 고민을 할 필요는 없습니다만, JVM에 기반한 웹언어를 사용시에는 유니코드를 사용할때 추가적인 조치를 해줘야 합니다.
사실 Windows나, Linux나 ASP나 PHP나 또는 JSP, ColdFusion과 같은 대부분의 것들이 영어권국가(미국)에서 만들어지고 개발되어진 탓에 그들의 언어에 태생적으로 얽여있다는 이유 등으로 그들은 특별한 조치없이 기본적으로 지원되는 ISO-8859-1과 같은 인코딩을 이용하여 편리하게 이용하는 반면, 한글과 같은 2Byte 문자권에서는 늘 무언가의 조치를 해줘야 하는 불편함이 있기는 매 한가지 입니다.
최근에 Ubuntu Linux에 구축된 외부의 VSFTP서버에서 디렉토리와 파일목록을 가져와야 하는 작업을해야 할 상황이 생겼습니다. 기본적으로 Ubuntu는 UTF-8환경이고, FTP의 디렉토리 및 파일명 역시 UTF-8 형식으로 만들어지고 저장된 파일이여서 큰 걱정을 안했는데 역시 불길한 예감은 틀린적이 없었습니다.
한글로 된 모든 디렉토리명 및 파일명이 깨져서 반환되는 것이었습니다. 실행되는 ColdFusion문서를 UTF-8로 처리하도록 해보았지만 역시나 동일한 결과. 그리하여 생각해낸게 Java로 아예 파일 및 디렉토리명의 문자열이 무슨 인코딩인지 알아보기로 했습니다.
간단하게, 구글링을 통하여 Detecting Character Encoding In Coldfusion 글을 참고하여 테스트한 결과 Latin1 즉, ISO-8859-1인코딩으로 디렉토리명과 파일명이 반환됨을 알게되었죠. 아래 그림을 참고하시면 이해가 빠르실 겁니다.
그림에서와 같이 어떤 FTP서버내에는 vod라는 디렉토리가 있는데 그 하위에 "스페셜"이란 한글로 명명된 디렉토리가 있습니다. 그리고 그 안에는 2개의 mp4파일이 존재하는데 각각 한자와 한글로 된 파일명을 가지고 있습니다.
일반적으로 CFFTP태그로 덤프(위 그림의 보라색 표 부분)를 해보거나 단순히 path와 같은 속성값을 출력해 보면 위 그림의 윗 부분처럼 한글(한자)로 된 부분이 깨져버립니다. 실행되는 ColdFusion문서자체가 UTF-8로 저장되고, 실행되고, 원격지의 FTP서버가 UTF-8로 운영되어도 말이죠. 아마도 추측컨데 JVM의 문제일듯합니다. 문자셋 문제는 대부분.
자, 그럼 위 그림의 UTF-8부분처럼 정상적으로 디렉토리명과 파일명을 가져오려면 어떻게 해야 할까요? 바로 파일을 가져올 디렉토리명의 한글을 ISO-8859-1로 그리고 반환되는 파일명을 UTF-8로 동적으로 변환해서 처리하면 됩니다.
<cfprocessingdirective pageencoding="utf-8">
<cfcontent type="text/html; charset=utf-8">
<!--- ISO-8859-1(Latin1)을 UTF-8로 --->
<cffunction name="convertToUTF8" access="private" returntype="string" output="false">
<cfargument name="txtString" type="string" required="true" />
<cfset encoder = createObject("java", "java.nio.charset.Charset").forName("ISO-8859-1").newEncoder() />
<cfif encoder.canEncode(txtString)>
<cfset convertedTxt = createobject("java", "java.lang.String").init(txtString.getbytes('ISO-8859-1'),'UTF-8').tostring()>
</cfif>
<cfreturn #convertedTxt# />
</cffunction>
<!--- UTF-8을 ISO-8859-1(Latin1)로 --->
<cffunction name="convertToLatin1" access="private" returntype="string" output="false">
<cfargument name="txtString" type="string" required="true" />
<cfset encoder = createObject("java", "java.nio.charset.Charset").forName("UTF-8").newEncoder() />
<cfif encoder.canEncode(txtString)>
<cfset convertedTxt = createobject("java", "java.lang.String").init(txtString.getbytes('UTF-8'),'ISO-8859-1').tostring()>
</cfif>
<cfreturn #convertedTxt# />
</cffunction>
<!---FTP연결 시작--->
<cfftp action="open" connection="ftpQuery" username="demouser" password="demopasswd" server="someserver" stopOnError="yes">
<!---
FTP디렉토리에 한글이 있는 경우 해당 디렉토리를 불러오려면 convertToLatin1 함수를
해당 디렉토리 및 파일명이 한글인 경우 깨지는 것을 막기위해 convertToUTF8 함수를
--->
<!--- 디렉토리 및 파일리스팅 --->
<cfftp action="listdir" stopOnError="yes" name="getDirFiles" directory="#convertToLatin1('/vod/스페셜/')#" connection="ftpQuery">
<cfoutput query="getDirFiles">
#convertToUTF8(path)# <br />
</cfoutput>
<hr />
<cfdump var="#getDirFiles#">
<!--- FTP연결 삭제 --->
<cfftp action="close" connection="ftpQuery" stopOnError="Yes">
위의 코드를 보죠. 위의 코드는 어떤 FTP에 연결과 "/vod/스페셜"이라는 디렉토리에서 파일들의 목록을 가져오는 코드입니다. 먼저 "/vod/스페셜"이라는 한글이 포함된 디렉토리명은 ISO-8859-1로 변환해서 ColdFusion서버에게 전달하고, ColdFusion서버에서 해당 FTP의 파일목록을 반환할때는 UTF-8로 반환되도록 함수를 2개 만들었습니다. 각각, convertToUTF8과 convertToLatin1라는 사용자정의함수(UDF : User Defined Function)입니다.
중간의 코드중에 directory="#convertToLatin1('/vod/스페셜/')#" 부분과 #convertToUTF8(path)# 부분에 각각 해당 함수가 쓰여 자동으로 문자열의 인코딩을 변경합니다.
대부분 CdolFusion에서 로컬서버 및 원격서버와의 파일송수신, 파일목록의 반환, 압축(CFZIP) 등의 작업을 처리할때 한글파일명과 디렉토리명이 늘 깨져 말썽인데요. 이 함수를 적당히 응용하면 대부분의 문제는 해결되리라 봅니다.
중요한 것은 ColdFusion서버가 Windows에서 구동되는 경우에는 이러한 문제가 거의 없다는 겁니다.(Windows가 좋다기보다 워낙 Windows는 모든 시스템의 문자셋을 해당 현지언어로 셋팅해버리기 때문에) 이 경우는 대부분 Linux에서 설치된 ColdFusion서버에서 발생하는 상황입니다. 혹시나 Linux나 Mac, Solaris와 같은 운영체제에서 ColdFusion을 구동하는 경우 한글처리에 도움되시길 바라는 마음에서 몇자 남깁니다. (물론, 중국어나 일본어도 동일하게 사용할 수 있겠죠?)
'ColdFusion' 카테고리의 다른 글
Adobe ColdFusion Pre-Release Program Closure (0) | 2021.04.17 |
---|---|
ColdFusion에서의 QR코드 생성, 그리고 Image Masking (0) | 2019.11.29 |
Lucee Server에서 PDF생성 시 한글 폰트(CJK custom font) 사용하기 (0) | 2019.09.23 |
Lucee Server에서 Remote address가 127.0.0.1로만 반환될 때 (2) | 2019.09.03 |
JSP와 ColdFusion의 Session 공유 (0) | 2019.08.26 |
ColdFusion에서 만들어 보는 동적 음성 Captcha (0) | 2019.08.26 |
Adobe ColdFusion Express Edition 다운로드 (0) | 2019.08.25 |
ColdFusion에서 Garbage Collection하기 (0) | 2019.08.25 |