utf-8 서비스에서 euc-kr 서비스로 소켓, 웹클라이언트 통신하기

최근에는 euc-kr로 서비스를 구축하는 사례가 드물기 때문에 euc-kr 서비스와 상호 통신을 하거나 데이터를 주고 받을일이 거의 없습니다.

레거시 서비스라고 할 수도 있는 euc-kr 서비스와 통신을 해야할 경우 경험이 없으면 끊임없이 특수문자로 깨져보이는 반환값과 끊임없이 사투를 벌여야 합니다.

구형인 PG서비스나, API 서비스가 주로 해당되지만, euc-kr 외에 타 언어도 같은 방법으로 처리가 가능합니다.

1. utf-8 서비스에서 euc-kr 서비스로 데이터 보내기

기 때문에 euc-kr 서비스와 상호 통신을 하거나 데이터를 주고 받을일이 거의 없습니다.

레거시 서비스라고 할 수도 있는 이 서비스와 통신을 해야할 경우 경험이 없으면 끊임없이 특수문자로 깨져보이는 반환값과 끊임없이 사투를 벌여야 합니다.

1. utf-8 서비스에서 euc-kr 서비스로 데이터 보내기

폼 데이터를 euc-kr 서비스로 전송할 경우 전송할 폼이 있는 페이지에 아래와 같이 설정해야 합니다.

A. 메타태그 설정

<html lang="ko">    <head>        <meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />

B. 폼(form) accept-charset 속성값 설정

<form id="myform" name="myform" method="post" action="https://domain.com/apiservice" accept-charset="euc-kr">

이렇게 2가지를 설정해주면 안정적으로 euc-kr 서비스로 euc-kr로 인코딩된 폼 데이터를 보낼 수 있습니다.

2. euc-kr 서비스로부터 utf-8 서비스가 데이터 수신하기

euc-kr 서비스에서 데이터를 수신할 때 올바른 인코딩 과정을 거쳐 데이터를 수신하지 않으면

데이터의 한글이 모두 특수문자로 깨지게 됩니다.

주의할 점이 있습니다.

인터넷에 알려진 수신한 데이터를 문자열 변수로 받아 utf-8로 변환하는 방법은 정상적으로 동작하지 않으므로 주의해야 합니다.

(개발 언어나 플랫폼에 따라 다를 수 있으므로 맞는 환경에 따라 다소 다를 수 있습니다.)

    public static string Utf8ToEuckr(string str)    {        string strEuckr = "";        if (!string.IsNullOrEmpty(str))        {            int euckrCodepage = 51949;            System.Text.Encoding euckr = System.Text.Encoding.GetEncoding(euckrCodepage);            byte[] euckrBytes = euckr.GetBytes(str);            strEuckr = euckr.GetString(euckrBytes);        }        return strEuckr;    }

닷넷 환경에서는 아래 방법으로 euc-kr 서비스에서 수신한 데이터를 utf-8로 변환해야 합니다.

Request["변수"], Request.Form["변수"] 를 사용해 수신한 euc-kr 변수 값을 문자열 등에 할당할 경우 utf-8로 정상적으로 변환이 되지 않습니다.

A. 먼저

받은 데이터를 바이트 어레이로 선변환해야 합니다.

byte[] buf = Request.BinaryRead(Request.TotalBytes);

이렇게 해서 Request 객체로 수신한 데이터 전체를 바이트 어레이로 선 변환 합니다.

B. 이후

string req = HttpUtility.UrlDecode(buf, System.Text.Encoding.GetEncoding("euc-kr"));

HttpUtility.UrlDecode 를 사용해 euc-kr 바이트 데이터를 utf-8 로 디코딩해서 utf-8문자열로 받환받습니다.

C. 변환된 문자열을 컬렉션으로 변환해서 키/밸류로 각각의 변수값을 얻을 수 있도록 합니다.

NameValueCollection reqData = HttpUtility.ParseQueryString(req);

이제 Request 객체에서 변수 값을 얻는 것과 마찬가지로 컬렉션에서

string rMsg = reqData["MSG"];

처럼 각 변수값들을 가져옵니다.