[ls증권 api] 뉴스 본문 한글 깨지지 않게 출력하기

위 api는 뉴스 본문을 100 바이트씩 잘라서 처리한다. 알파베트와 숫자는 한 글자가 1 바이트로 처리되므로 문제될 게 없는데 한글은 그렇지 않아서 100 바이트씩 끝나고 시작하는 지점에서 깨진다.

위 문제를 피하려면 t3102OutBlock*를 occurs로 나눠 처리하지 않고 아래와 같이 통째로 변환한다.

byte[] buffer = new byte[requestResponsePacket.DataLength];

Marshal.Copy(requestResponsePacket.Data, buffer, 0, buffer.Length);

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

string content = Encoding.GetEncoding("euc-kr").GetString(buffer);

Marshal.Copy는 언매니지드 메모리 포인터를 매니지드 배열로 복사한다.

ls증권의 서버는 utf-8도 16도 아닌 euc-kr로 인코드를 한다. euc-kr는 utf-8이나 16보다 전에 나온 거다.

위의 서버가 보낸 한글을 출력하려면 euc-kr로 디코드를 해야 하는데 .네트가 utf-8과 16은 기본 지원하지만 euc-kr는 그러지 않는다. 이걸 가능하게 하려면 encoding provider를 이용해야 한다. CodePagesEncodingProvider를 이용하면 euc-kr을 쓸 수 있다.

RegisterProvider는 한 번만 실행하면 된다.