Socket.iO comunication between Visual Studio based C++ and nodeJS (활용편)

반응형
728x90
반응형
 
Introduction

nodejs web Server와 Visual Studio C++ 기반의 socket.io client 의 통신 모듈 테스트를 진행하였습니다. 지난 포스팅에서는 접속관련하여 포스팅을 하였지만, 이번 포스팅에서는 한글 전송방법에 대해 이야기드리도록 하겠습니다. 
 
#관련 포스팅
 
 
한글 문제 해결 방법(socket.io-client-cpp with nodeJS WebServer)

 
#문제점
한글 인코딩과 관련하여 가장 먼저 다음과 같이 테스트를 하였습니다. 
 
    rapidjson::Document document;
    document.SetObject();
    rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
    document.AddMember("sender", "from Win_VS", allocator);
    document.AddMember("recepient", "ALL", allocator);
    document.AddMember("command", "chat", allocator);
    document.AddMember("type", "text", allocator);

    // 한글 테스트
    document.AddMember("data", "안녕하세요", allocator); // 한글 입력
 
그럼 visual studio는 다음과 같은 오류를 출력 합니다. 
 
Error #1
 
Severity    Code    Description    Project    File    Line    Suppression State
Error    C2664    'rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>::GenericValue(rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>> &&)': cannot convert argument 1 from 'T' to 'rapidjson::Type'    
 
오류를 출력하게 되어, wstring, string 관련 변수를 사용할 수 있는지 찾아보았습니다. 
 

 

 

 
#해결방법 
먼저, 해결방법 테스트 완료한 것 부터 이야기 드리도록 하겠습니다. 
 
#include <codecvt>
#include <string>

// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str){
       std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
       return myconv.from_bytes(str);
}

// convert wstring to UTF-8 string
std::string wstring_to_utf8 (const std::wstring& str){
       std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
       return myconv.to_bytes(str);
}
 
 
위의 코드를 이용하여 Unicode를 전송할 수 있습니다. 사용방법은 다음과 같습니다. 
 
    // 생략 ...
    wstring _StrTest = L"안녕하세요";
    string _resultStr = wstring_to_utf8(_StrTest);
    rapidjson::Value strValue;
    strValue.SetString(_resultStr.c_str(), _resultStr.length(), allocator);
    document.AddMember("data", strValue, allocator);
 
한글을 이용하여, string 형태로 변환합니다. 그리고 Addmenber() 함수에 값을 추가하면 됩니다. wstring 자료형만 변경하면 string형으로도 사용할 수 있습니다. 
 
 
기타방법(안보셔도 됩니다.)

 
#define RAPIDJSON_HAS_STDSTRING 1
 
코드를 추가하였을 경우, 변함없음. 
 
 
std::wstring wStr = L"우하하";
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> utf8Conv;
auto utf8Str = utf8Conv.to_bytes(wStr.c_str());

std::u16string utf16Str = u"우하하";
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> utf8Conv;
auto utf8Str = utf8Conv.to_bytes(utf16Str.c_str());
 
상위 코드는 wstring에서 UTF-8로 문자열을 변환하는 방법입니다. 하지만 사용이 안됩니다. (gcc/clang에서는 문제 없이 된다고 합니다.)
 
std::u16string utf16Str = u"우하하";
std::wstring_convert<std::codecvt_utf8<uint16_t>, uint16_t> utf8Conv;
auto utf8Str = utf8Conv.to_bytes(reinterpret_cast<const uint16_t*>(utf16Str.c_str()));
 
상위 코드는 해당 블로그에서 해결완료되었다고 표기되어있지만, 다른 자료형과의 사용을 위해서 테스트하지는 않았으니 참고하여 사용해보시기 바랍니다. 
 

 

 

 
새로운 Visual stduio 에서 시작하기

 
#Visual studio Setting
  • Include
    • D:\SDK\Boost\boost_1_74_0
    • D:\SDK\Boost\boost_1_74_0\boost\websocketpp
    • D:\SDK\Boost\boost_1_74_0\boost\rapidjson\include
  • Library
    • D:\SDK\Boost\boost_1_74_0\stage\lib
 
 
#Error: error C1017: invalid integer constant expression
 
상기 에러가 발생하는 장소는 아래와 같습니다. 
  • sio_client_impl.cpp / 2 건
  • sio_socket.cpp / 1 건
 
DEBUG 관련하여 아래와 같이 수정하시면 됩니다. 
 
#기존
#if DEBUG || _DEBUG
#define LOG(x) std::cout << x
#else
#define LOG(x)
#endif
 
#변경
#ifdef DEBUG || _DEBUG
#define LOG(x) std::cout << x
#else
#define LOG(x)
#endif
 
이와 같이 수정하시면 build OK. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
728x90
반응형

댓글

Designed by JB FACTORY