환경
서버 : c++
클라 : 유니티
마샬링이 아닌 바이트스트림으로 Serialize 통신
채팅기능을 구현하여 클라이언트간 한글 통신을 하게 하려고 할때
클라이언트에서 Encoding.UTF8.GetBytes(str) 이와같은 형태로 Byte를 얻어 c++ 서버로 보내는 형식을 취했었는데
유니티에서 UTF8 로 Encoding시 "안녕" 이라는 문자열이 6개의 바이트로 표현되는 것으로 나타났다.
즉 한글 한 문자당 3바이트를 차지한다는 것이다. (지금까지 2바이트로 알고 있었는데 말이죠..)
찾아보니
(1) 보통의 한국어 텍스트 문서: 이것은 아스키 문서이며 유니코드가 아닙니다. 영문/숫자/기호는 1바이트. 한글과 한자는 2바이트로 표현됩니다. euc-kr 또는 ksc_c_5601-1987 로 불리는 인코딩이며 웹페이지 작성에 사용할 수 있습니다. 특수한 외국어 문자나 일본식/중국식 한자는 표현할 수 없습니다.
다음의 2개가 유니코드입니다:
(2) 일반 유니코드(Unicode): 모든 글자를 2바이트로 표현합니다. 전세계 모든 글자들을 한꺼번에 표현할 수 있습니다. 인터넷에 HTML 파일로 올릴 수 없습니다. 즉 웹페이지 작성에 쓸 수 없습니다.
(3) UTF-8 유니코드: 영문/숫자/기호는 1바이트로, 한글과 한자 등은 3바이트로 표현합니다. 전세계 모든 글자들을 한꺼번에 표현할 수 있습니다. 웹페이지 작성에 쓸 수 있습니다. (저의 mwultong.blogspot.com 이 블로그도 UTF-8 로 되어 있습니다)
http://mwultong.blogspot.com/2006/05/unicode-utf-8.html
일반 유니코드(Unicode)와 'UTF-8 유니코드'의 차이점, 차이
mwultong.blogspot.com
라고 설명되어 있었다. 즉 c++ 에서 받은 나는 일반 유니코드이므로 2바이트로 한글을 읽고 유니티에서는 3바이트로
한글을 읽으니 유니티에서 보낸 문자열이 제대로 표현이 되지않았다.
그럼 유니티에서 보낼때 제대로 보내면 되지않는가? ==> 제대로 서버에서도 제대로 받는 함수로는Encoding.Default.GetBytes(str) 가 있었는데 분명 잘 되던게 빌드파일로 돌릴때는 한글이 다시 3바이트로 표현돼서 들어왔다.
그런데 사실 내 서버에서는 굳이 채팅 문자열을 콘솔창에 찍어서 보아도 관련 기능이 딱히 없어서 그냥 받는 3바이트 그대로 다시 다른 클라이언트에 넘겨 줌으로써 다른 클라이언트들에게 한글문자열을 보여주게 했다..
https://trowind.tistory.com/61 이쪽에서는 만약 UTF-8 로 변환해서 보고 싶으면 도와주는 것을 설명하고 있다.
'유니티' 카테고리의 다른 글
중간 발표, 피드백 (0) | 2018.05.29 |
---|---|
게임 내 출석부 구현 (0) | 2018.05.27 |
UI OnOff Sprite Change (0) | 2018.05.27 |
UI : Canvas VS CameraScreen (0) | 2018.05.27 |