상세 컨텐츠

본문 제목

Unicode

똑똑한 개발/C++ 게임개발

by 성댕쓰 2023. 5. 7. 00:26

본문

가변길이 데이터 중 문자열을 보내는 방법에 대해 알아보자.

char sendData[1000] = "가"; // CP949
char sendData[1000] = u8"가"; // UTF-8 Unicode (한글 3바이트 + 로마 1바이트)
WCHAR sendData[1000] = L"가"; // UTF-16 (한글, 로마 2바이트)
TCHAR sendData[1000] = _T("가");

ClientPacketHandler.cpp

 

struct S_TEST
{
	uint64 id;
	uint32 hp;
	uint16 attack;
	// 가변 데이터
	// 1) 문자열 (ex. name)
	// 2) 그냥 바이트 배열 (ex. 길드 이미지)
	// 3) 일반 리스트
	vector<int64> buffs;

	wstring name;
};

...

void ClientPacketHandler::Handle_S_TEST(BYTE* buffer, int32 len)
{
	BufferReader br(buffer, len);

	PacketHeader header;
	br >> header;

	...

	wstring name;
	uint16 nameLen;
	br >> nameLen;
	name.resize(nameLen);

	br.Read((void*)name.data(), nameLen * sizeof(WCHAR));

	wcout.imbue(std::locale("kor"));
	wcout << name << endl;
}

ServerPacketHandler.cpp

SendBufferRef ServerPacketHandler::Make_S_TEST(uint64 id, uint32 hp, uint16 attack, vector<BuffData> buffs, wstring name)
{
	SendBufferRef sendBuffer = GSendBufferManager->Open(4096);
	
	BufferWriter bw(sendBuffer->Buffer(), sendBuffer->AllocSize());

	PacketHeader* header = bw.Reserve<PacketHeader>();
    
...

	bw << (uint16)name.size();
	bw.Write((void*)name.data(), name.size() * sizeof(WCHAR));

	header->size = bw.WriteSize();
	header->id = S_TEST; // 1 : Test Msg

	sendBuffer->Close(bw.WriteSize());

	return sendBuffer;
}

 

1. 문자열 집합과 인코딩의 차이는?

- 문자열 집합은 문자를 숫자에 매핑한 정보, 인코딩은 매핑한 정보를 어떻게 해석할 것인지에 대한 정보

 

2. UTF-8 encoding 이란?

- Unicode 문자열 집합을 해석하는 방법, e.g) 첫 바이트 마지막 비트가 0 이면 1바이트 만으로 해석하고 그렇지 않으면 2~3바이트로 해석하는 방법 (한글은 3바이트)

 

3. UTF-16 encoding 이란?

- Unicode 문자열 집합을 해석하는 방법. UTF-8 과 다르게 BMP 이외 모든 문자를 2바이트로 해석하는 방법

 

4. CP949 란?

- Encoding 방법, 그런데 2 가지 문자집합을 이용한다.

 

5. MBCS vs WBCS

- MBCS 는 가변길이 인코딩, WBCS 는 고정길이 인코딩. MBCS 대표로 UTF-8, WBCS 는 UTF-16이 있다.

 

참조 : [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 대시보드 - 인프런 | 강의 (inflearn.com)

'똑똑한 개발 > C++ 게임개발' 카테고리의 다른 글

PacketHandler  (0) 2023.05.06
Buffer Helpers  (0) 2023.04.19
Packet Session  (0) 2023.04.16
SendBuffer Pooling  (0) 2023.04.05
SendBuffer  (0) 2021.12.21

관련글 더보기

댓글 영역