Delphi 및 C++Builder에는 dfm 폼 파일을 바이너리에서 텍스트로 혹은 그 반대로 변환하기 위한 유틸리티 convert.exe가 포함되어 있습니다. 일반적으로는 텍스트 포맷의 dfm 파일이 유리한 점이 많은데, 예를 들면 당연히 텍스트 파일만이 diff가 가능하기 때문에 SubVersion 같은 버전 관리 시스템에서 관리하기도 편리합니다.
Delphi 및 C++Builder의 아주 오래된 버전들에서는 바이너리 dfm 포맷을 기본으로 사용했었기 때문에, 간혹 바이너리 dfm 파일들을 text 포맷으로 변환할 일들이 생깁니다. 그럴 때 커맨드라인 유틸리티 convert.exe는 아주 유용하죠.
그런데 여기에 문제가 하나 있으니, 폼에 한글 문자열이 포함되어 있을 경우 convert.exe는 그 한글을 제대로 인식하지 못하고 모두 깨진 상태로 변환시켜버린다는 것입니다. 예를 들면 폼이나 레이블의 Caption 등에 한글 문자열을 지정했을 때가 그런데요. 설사 폼에 한글을 전혀 사용하지 않았더라도, 에디트의 ImeName 등의 속성에는 어쩔 수 없이 “한국어 입력 시스템 (IME 2000)” 등의 한글이 들어가고 이것 역시 깨져버립니다.
그래서, 서드파티의 dfm 컨버터 프로그램들을 찾아봤습니다만, 모두 똑같은 한글 깨짐 문제가 있었습니다. 그래서 바이너리 폼을 텍스트로 변환하면서 한글을 제대로 유니코드로 변환하는 유틸리티를 만들어봤습니다.
아래 링크에서 다운로드 가능합니다.
ImpDfmConvert.zip
참고로, Convert.exe가 폼에 포함된 한글을 제대로 변환하지 못하는 이유는, RTL의 버그 때문입니다. 폼을 바이너리-텍스트로 변환하는 실제 코드는 Classes 유닛의 ObjectBinaryToText 프로시저인데, 이 프로시저의 코드에서 유니코드 문자에 대한 고려가 되어 있지 않아서 발생하는 문제입니다. (초기버전들부터 가장 최신 버전인 XE5까지 마찬가지입니다) 이 프로시저를 직접 호출할 일이 있는 개발자는 별로 없을 거 같고, 엠바카데로가 요 몇년 동안 버그 처리를 제대로 하고 있지도 않아서 귀찮아서 버그 리포팅은 안했습니다.
와.. 감사합니다…
editplus에서 dfm 작업 후 저장했더니 dfm전부가 깨져버려서 고생하고있었는데. 컨버트 하니 해결했습니다..
일주일을 고민했는데.. 감사드립니다.