혁신적이면서 상당히 광범위하고 간간히 전문적인 상식과 진실에 기초한 정신과 이노의 본격 아나키 블로그

Posted
Filed under 이노/Programmings

최근 ESC/POS 포맷을 지원하는 POS용 열전사 프린터를 지원해야 할 일이 있었다.
Serial Port기반으로 AnsiString을 지원하는 매우 단순한 포맷으로 대부분 별 문제가 없었는데 역시나 대부분의 구형포맷이 그렇듯 한글출력에서 문제가 발생했다.

UnicodeString을 기본포맷으로 지원하는 델파이는 AnsiString은 별도 포맷으로 지원하고 있는데(아마도 2009 이후) 별다른 설정을 하지 않으면 OS의 Codepage를 따라간다.
결국 AnsiString으로 선언하여 String을 대입하면 CP949포맷으로 입력되는데 문제는 POS프린터가 CP949가 아닌 euc-kr만을 지원한다는 것.

‘똠‘이나 ‘뷁‘과 같은 euc-kr이 지원하지 않은 문자를 같이 입력하면 프린터가 심하게 깨지면서 출력되는 문제가 발생하여 자료를 찾아보았다.

델파이가 유니코드 기반으로 바뀌면서 새롭게 만들어진 스트링포맷인 AnsiString을 그냥 ASCII기반의 문자열 포맷이라고 생각하는 사람들이 대부분인데 코드를 들여다보면 다국어 처리 및 코드페이지에 대해 많은 고민을 하고 만들어진 포맷이라는 것을 알 수 있다.

기능에 대한 많은 내용들은 Delphi, AnsiString 등으로 검색하면 나오니 각설하고...

완성형만을 지원하는 (확장 완성형말고 그냥 완성형)기기에 출력하기 위해서는 CodePage를 정확히 지정해줘야 한다. 처음에는 euc-kr이 유닉스 포맷이고 표준으로 지정되지 않았기 때문에 지정된 코드페이지가 없는줄 알고 멘붕했으나 MSDN을 뒤지다 보니 euc-kr도 코드페이지가 있다는 사실을 알았다.


type
  EucKrString = type AnsiString(51949);

var
  str : string;
  ansi : EucKrString;

begin
  str := ‘똠방각하’;
  ansi := str;
  ShowMessage(String(ansi) + IntToStr(StringCodePage(ansi)));

end;

출력되지 않는 문자는 ?로 변경되는 것을 볼 수 있다.

2015/11/19 10:36 2015/11/19 10:36