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"];
처럼 각 변수값들을 가져옵니다.