2014-01-17 3 views
1

C# 소켓을 통해 키릴 문자 "УБА221"을 보내는 데 문제가 있습니다. '# xxxxx221'(으)로 바뀌 었습니다. 여기에 xxxxx는 제가 붙여 넣기를 복사 할 수없는 이상한 알파벳입니다. (전송)Socket을 통해 키릴 문자를 보내시겠습니까?

SocketPacket theSockId = (SocketPacket)asyn.AsyncState; 
int iRx = theSockId.thisSocket.EndReceive(asyn); 
char[] chars = new char[iRx + 1]; 
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); 
int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0); 
System.String szData = new System.String(chars); 
TextLabel.Text =TextLabel.Text+ szData; 

클라이언트 측 :

서버 측 (수신 측)

subtext = "УБА221"; 
byte[] byData = System.Text.Encoding.UTF8.GetBytes(subtext); 
socket.Send(byData); 

내 코드가 작동하지 않는 이유는 어떤 생각이 있습니까?

텍스트를 인코딩하는 방법에 대해
+0

UTF32를 UTF8로 변경했습니다. 그러나 여전히 작동하지 않습니다. 나중에 Encoding.UTF8.GetString (bytes, 0, bytesToDecode)을 시도 할 것입니다. – user3145861

답변

2

봐 그것을 보낼 : 당신을 사용하고

System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); 

:

byte[] byData = System.Text.Encoding.UTF32.GetBytes(subtext); 

이제 당신은 어떻게 텍스트로 다시 이진 데이터를 디코딩하고 볼 인코딩 할 UTF-32 및 디코딩 할 UTF-8 그게 효과가 없을거야. 양쪽 모두 동일한 인코딩을 사용해야합니다.

또한 참고 : 단 하나의 바이트 배열을 디코딩 할을 오히려 Encoding.UTF8.GetString(bytes, 0, bytesToDecode)를 사용 경우 하나의 BeginReceive/EndReceive 전화

  • 에서 전체 텍스트를받은 것입니다 보장도 없다

    • 을 통해가는 것보다 Decoder. , 당신은 당신이 다른 읽기의 한 읽기 호출 문자 다음 부분의 일부를 얻을 경우 상황을 처리하려면
    • , 당신은Decoder를 사용하는 것이 좋습니다 ,하지만 당신은 읽기 통화 사이의 Decoder을 유지해야합니다 "아직 디코딩되지 않은 데이터"의 상태를 저장합니다.
  • +0

    소켓 읽기 사이클 당 1 개의 문자가 나옵니다. 위의 수신 코드는 OnDataReceived 안에 있습니다. 어떻게 전체 문자열을 읽을 수 있습니까? – user3145861

    +0

    @ user3145861 : 수신 통화가 어떤 모양인지는 알 수 없습니다. 질문에 포함 시키십시오. 한 번에 전체 문자열을 읽을 것이라고 가정 할 수는 없지만 스트리밍 프로토콜이 작동하는 방식은 아닙니다. (우리는 또한 당신이 사용하고있는 더 높은 수준의 프로토콜을 모른다 - 다른 쪽이 소켓을 닫을 때까지 계속 읽으려고합니까, 아니면 메시지가 언제 끝났음을 나타낼 것인지 알고 싶습니까?) –

    관련 문제