안녕하세요 . 저번에 포스팅 된 비동기화채팅프로그램 잘 보셨나요??
제가 만들면서 오류가 났었던 부분에 대해서 알려드리고자 합니다.
저번에 포스팅된 소스코드는 다음과 같습니다.
private void button2_Click(object sender, EventArgs e) //전송 버튼 이벤트{try{System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();// 시스템에 디코딩할 UTF8Encoding을 enc변수에 저장을 시킵니다.byte[] msg = new byte[1500]; // msg라는 바이트 배열변수를 생성msg = enc.GetBytes(textMessage.Text);// msg변수에 textMessage.text에 입력된 내용을 가져와 디코딩 합니다.sck.Send(msg); // 연결된 소켓에 msg를 보냅니다 . 즉 textMessage에 입력된 내용을 보냅니다.listMessage.Items.Add("나: " + textMessage.Text); // 채팅내용에 내가 쓴 내용을 추가해줍니다.textMessage.Clear(); // 입력한 내용은 초기화가 됩니다.}catch (Exception ex){MessageBox.Show(ex.ToString());}}
"소스 코드를 보고 따라하셨거나 , 실행해 분들은 어떤 부분이 오류가 났었던 거지" 라는 생각을 할거에요.
올린 소스코드는 제가 최종적으로 오류를 수정한 소스 코드였기 때문입니다.
본론으로 들어가 보겠습니다.
try 문안에 보시면 UTF8Encoding 으로 enc 변수를 선언해 주신 것을 확인 할 수 있습니다.
원래 초기에는 asciiEncoding 으로 enc 변수를 선언해 주었습니다.
왜냐면 통신을 할 때 바이트 단위의 신호로 서로 통신을 하기 때문에 asciiEncoding이 맞다고 생각하였습니다.
또한 asciiEncoding의 속성을 보면 다음과 같습니다.
ASCII 인코딩은 대개 ASCII가 필요한 프로토콜에 적합합니다.
8 비트 인코딩 ( "ASCII"라고 잘못 칭하는 경우도 있음)이 필요한 경우 ASCII 인코딩보다 UTF-8 인코딩을 사용하는 것이 좋습니다. 0-7F 문자의 경우 결과는 동일하지만 UTF-8을 사용하면 표현할 수있는 모든 유니 코드 문자의 표현을 허용하여 데이터 손실을 피할 수 있습니다. ASCII 인코딩은 악의적 인 사용을 허용 할 수있는 8 번째 비트 모호성을 가지고 있지만 UTF-8 인코딩은 8 번째 비트에 대한 모호성을 제거합니다.
.NET Framework 버전 2.0 이전에는 .NET Framework가 8 번째 비트를 무시하여 스푸핑을 허용했습니다. .NET Framework 2.0부터는 비 ASCII 코드 포인트가 디코딩 중에 반환됩니다.
ASCII 문자는 U + 0000에서 U + 007F까지의 최소 128 유니 코드 문자로 제한됩니다.
결론은 asciiEncoding은 유니 코드 문자로 제한이 된다는 것입니다.
또한 MS 공식 사이트를 들어가 보면 asciiEncoding 보다는 UTF8Encoding 사용을 권장하고 있었습니다.
UTF8Encoding의 속성은 다음과 같다.
이 속성은 반환 된 UTF8Encoding 개체 문자당 1 ~ 4 바이트의 시퀀스로 유니코드 문자 (u t F-16으로 인코딩된) 인코딩한 하는 유니코드 문자 (u t F-16으로 인코딩된)를 u t F-8로 인코딩된 바이트 배열로 디코딩합니다. .NET Framework 및 인코딩을 사용 하는 유니코드에 대 한 설명을에서 지 원하는 문자 인코딩에 대 한 정보를 참조 하십시오. .NET Framework의 문자 인코딩합니다.UTF8Encoding 이 속성에서 반환 되는 개체는 응용 프로그램에 대 한 적절 한 동작을 없을 수 있습니다.
반환 된 UTF8Encoding 유니코드 바이트 순서 표시 (BOM)를 제공 하는 개체입니다. BOM을 제공 하지는 UTF8 인코딩을 인스턴스화할 때 호출 오버 로드는 UTF8Encoding 생성자입니다.
반환 된 UTF8Encoding 교체 대체 (fallback)를 사용 하 여 인코딩할 수 없는 각 문자열과 디코딩할 수 없는 각 바이트를 물음표로 대체 하는 개체 ("?") 문자로 대체되는 삼중자 시퀀스이기 때문입니다. 대신 호출할 수 있습니다는
결론적으로 말씀을 드리면 , 비동기화 채팅을 만들 때 ,
통신에서의 decoding or encoding 문제가 발생 하거나 , 영어는 통신이 되지만 , 한글은 통신이 안될 때
asciiEncodig --> UTF8Encoding으로 치환해서 써보시는 걸 권장드립니다 .
'프로젝트 > C#' 카테고리의 다른 글
C# 에서 간단한 비동기화채팅을 만들어 보기 (0) | 2018.07.24 |
---|---|
C#에서 Winform을 이용해서 Daum지도 사용하기 (0) | 2018.07.24 |
#IT #먹방 #전자기기 #일상
#개발 #일상