2011-08-25 4 views
0

C# .NET에는 연결을 수신하는 소켓 수신기가 있습니다. 연결은 주로 non-latin 문자로 서버 데이터를 보낼 수있는 RUSSIAN 또는 CHINESE 클라이언트에서 발생합니다. 소켓 수신 데이터에 적합한 인코더를 결정하는 방법. 이 코드를 사용했지만 라틴 문자 이외의 다른 데이터는 ??? chars.들어오는 비 - 라틴 소켓 데이터와 함께 사용할 인코더를 결정하는 방법

  byte [] buffer = new byte[1024]; 
      int iRx = m_socWorker.Receive (buffer); 
      char[] chars = new char[iRx]; 

      System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); 
      int charLen = d.GetChars(buffer, 0, iRx, chars, 0); 
      System.String szData = new System.String(chars); 
      txtDataRx.Text = szData; 
+0

알 수없는 인코딩으로 텍스트를 수신하는 경우 프로토콜에 결함이 있습니다. 프로토콜을 수정하십시오. – tripleee

답변

1

엔코딩은 일련의 바이트로 문자를 작성하는 방법에 대한 계약입니다. 일련의 바이트를보고이를 작성하는 데 사용 된 인코딩을 판별 할 수 없습니다.

코드는 현재 데이터를 디코딩하는 UTF8을 사용 - UTF8은 러시아와 중국 문자를 저장할 수 있지만, 당신은 클라이언트 인코딩 UTF8로 데이터도 확인해야합니다.

더욱이 이러한 문자를 표시하려면 언어를 지원하는 글꼴이 있어야합니다 (러시아어는 알파벳에 고정 된 수의 문자를 포함하고 있기 때문에 중국어는 수천 개의 "문자"가 있고 사용자는 글꼴을 다운로드해야 화면에 표시 될 수 있습니다). 일반적으로 지원되지 않는 문자는 빈 사각형으로 표시되지만 인코딩에서 지원되지 않는 문자가 사용될 때 물음표가 생성됩니다.

Joel은 읽고 싶은 인코딩에 대한 (기본) 정보가 더 많이 포함 된 article을 만들었습니다.

+0

그래서 전혀 감지 할 방법이 없습니까? 문제는 클라이언트가 어떤 형식으로 ** 일반적으로 ** 데이터를 전송하는지 모른다는 것입니다. 따라서 클라이언트가 러시아어 인 경우 클라이언트가 UTF8 이외의 데이터를 보낼 수있는 형식이 얼마나됩니까? – Claudio

+0

데이터에 Byte Order 표시 (http://en.wikipedia.org/wiki/Byte_order_mark)가 포함되어있는 경우 UTF 중 하나를 취급한다고 가정 할 수 있습니다. 그렇지 않으면 할 수있는 일은 모두 추측입니다. Wikipedia를 방문하면 러시아어 텍스트가 UTF7/8/16/32, Windows-1251, ISO 8859-5, CP866, KOI7/8, 심지어 다른 언어로 인코딩 될 수 있음을 알 수 있습니다. "일반적으로"일반적으로 프로그래머를위한 좋은 시작되지 않습니다. –

관련 문제