[LINUX/C언어] 한글 짤리지 않게 하기

     




서버와 클라이언트 사이에 한글 데이터를 받게 되면 가끔 서버에서 주는 한글을 전부 받지 않고 일부만 받아야 하는 경우가 생긴다. 


가령 클라이언트에서 수신하는 구조체의 필드가 char [40] 인데 서버에서 전송하는 데이터가 char [40] 에서 char [80] 으로 늘었다고 생각하자. 그럼 당연히 클라이언트의 구조체 필드를 40에서 80으로 늘려주면 간단히 해결된다. 하지만 24시간 항시 운영되는 서버같은경우, 구조체를 변경하려면 서버를 내렸다 올려야하기 때문에 서비스가 끊킬 수 있다. 


특히 증권같이 시세데이터를 실시간으로 받으며 고객에서 데이터를 제공하는 환경은 더더욱 그렇다. 클라이언트의 구조체를 쉽게 바꾸지 못하기 때문에 사용하지 않는 데이터의 경우 그냥 80바이트의 한글 데이터를 40바이트로 짤라서 받는 경우가 있다. 데이터를 사용하지는 않지만 40바이트의 데이터는 저장되기 때문에 데이터가 완전 쓸모없는 것은 아니다. 문제는 80바이트를 40바이트로 자를때 생긴다. 한글은 영어와 달리 2~3Byte를 차지하기 때문에 잘못하면 맨 마지막 40Byte가 한글 한 문자의 시작일 경우 저장된 데이터의 마지막 글자가 짤리는 경우가 발생한다.


이런 문제를 해결하기 위해 데이터를 검사해 맨 마지막 자리가 한글의 시작인지 판단하는 로직이 필요하다.




로직은 간단하다. 한글로 된 문자열을 처음부터 한글자씩 조사하여 한글일경우 한글 데이터형 수만큼, 한글이 아닐경우 1Byte씩 늘려주는 로직을 만들면 된다. 여기서 중요한 것은 문자가 한글인지 한글이 아닌지 체크하는 것이다. 보통 한글은 0x80보다 크기 때문에 문자&0x80으로 조건문을 걸면 한글인지 한글이 아닌지 체크할 수 있다. 위 코드를 실행하면 결과는 다음과 같다.




전부 한글이라서 가지런히 나오게 됩니다. 


그럼 중간에 한글이 아닌 영어를 섞어 볼까요?





공백과 영어를 사이사이에 넣었습니다. 문자를 처음부터 끝까지 검색하면서 한글과 비한글을 걸러냈습니다.


코드상의 i값을 60으로 제한했고 제가 사용한 언어셋이 UTF-8(한글 3바이트)인 점을 감안하면 한글 20개를 출력하게 됩니다. 중간에 영어가 섞여있다면 60바이트로 자르게 되죠. 만약 59번째가 한글의 시작이면 58바이트로만 데이터가 채워집니다.


이렇게 간단한 로직으로 마지막 자리의 한글이 깨져서 저장되는 것을 막을 수 있습니다 ^^

반응형

댓글

Designed by JB FACTORY