Swift와 Windows(C/C++)의 TCP소켓통신의 한글인코딩 문제

반응형
728x90
반응형
 
 
Introduction

최근 socket.io와 관련된 내용은 포스팅 했었습니다. 물론 socket.io 이전에 가장 익숙한 TCP/IP 형태의 소켓을 이용하여 개발을 먼저 시도하였죠. 연결과 영문 전송은 성공입니다. 하지만, 한글은 제대로 전송이 되지 않더군요. 물론 macOS에서 Windows와 다른 인코딩을 사용한다는 것은 알고 있었지만, 쉽게 해결되지 않을꺼란 생각을 했었죠. 그래서 '한국어'와 관련한 인코딩에 대해 서베이를 시작하였습니다. 자료는 1998년도부터 최근자료까지 다 찾아봤죠. 크게보면 중복된 내용들이 블로그를 타고타고 넘어가서 만들어진 자료들이더군요. 자료는 정리 중이니 이후 블로그에서 확인하시면 될 것 같고, 본론인 swift와 Windows에서 개발한 C/C++에서의 한글 인코딩 문제는 어떻게 해결하는지에 대해 알아보도록 하겠습니다. 해결방법은 여러가지가 있겠지만, 아래의 내용은 한가지 방편뿐이니 참고하시기 바랍니다. 
 
 
Swift & Windows code

 
cocoapods의 swiftSocket을 이용하여 개발을 하였습니다. 물론 테스트 코드이기때문에 이쁜코드가 아니니 참고
 
먼저 Swift에서 String을 Library를 이용하여 전달하게 됩니다. 내부적으로는 byte 형태의 자료로 변환하여 전달하더군요.  결국은 Linux에서 사용하는 socket의 select model을 이용할뿐 Windows Socket과 다른점은 없습니다. 
 
swift에서는 아래의 함수를 이용하여 인코딩을 한다고 되어있었습니다.  일단 위 주석처럼 하고 전송을 하면 한글이 제대로 안넘어갑니다. 
 
precomposedStringWithCanonicalMapping
decomposedStringWithCanonicalMapping
 

 

 

 
인코딩 문제인 건 확실하기 때문에 다른 방법을 찾아보았죠. macOS는 UTF-8 NFD 를 사용하고 Windows는 UTF-8-NFC 인코딩을 이용하고 있습니다. 그래서 NFD <-> NFC의 인코딩 변환방법에 대해 찾아보았죠. 자료는 많이 나오지만, 해결이 안되더군요. 물론 swift 및 Windows에서 둘다 변환 작업을 시도 했었습니다. 아아 결론...
 
결론은 아래의 코드를 이용하였습니다. swift에서는 한글관련은 아래의 코드를 이용한다고 되어있더군요. 아래의 코드는 String에 들어간 문자를 URL형태로 인코딩 해주는 것입니다. 
 
addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
 
아래는 Windows에서 개발하던 socket 모듈입니다. 윈도우즈에서는 반대로 URL 형태의 글자를 디코딩을 해주시면 됩니다.  디코딩 전/후으로는 아래의 예시와 같이 나타나게 됩니다. 
 
// 디코딩 전: %ED%95%9C%EA%B8%80
// 디코딩 후: 한글
 
디버깅을 하며 값을 찍어보니 아래와 같았죠.  잘보이죠? "한글" ...
 
몇가지 유의하실 점으로, 유니코드기반 Visual studio project에서 인코딩을 수행하셔야 합니다. Win32 api, MFC 등등...에서하지 않고 console에서 작업하시면 글자 깨져서 못읽는다는 메시지가 뜨겠죠? 
 
 
 
 
 
 
 
 
728x90
반응형

댓글

Designed by JB FACTORY