반응형
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
반응형
'Develop > Swift' 카테고리의 다른 글
한글 완성형<->조합형 변환코드 및 인코딩(EUC-KR, UTF-8, CP949) (2) | 2020.12.20 |
---|---|
Swift와 Windows(C/C++)의 TCP소켓통신의 한글인코딩 문제 (0) | 2020.12.10 |
Socket.iO comunication between iOS app and nodeJS (7) | 2020.11.29 |
SwiftUI (기존/예정) 포스팅 리스트 정리 편 (0) | 2020.11.26 |
SwiftUI @State @Binding 초기화 파라미터 전달 방법 및 navigationBar 및 TabView 사용시 문제점 해결방법 (0) | 2020.11.24 |
Swift 개발을 위한 라이브러리 추천 (0) | 2020.11.23 |
SwiftUI 채팅앱 만들기 마무리편 (2) | 2020.11.21 |
SwiftUI로 채팅UI 화면 만들기 (0) | 2020.11.20 |
SwiftUI로 채팅 리스트 화면 만들기 (0) | 2020.11.19 |
SwiftUI로 친구목록 화면 만들기 (0) | 2020.11.18 |