8

我正在尝试通过 TcpClient (byte[]) 发送包含特殊字符的字符串。这是一个例子:

  • 客户在文本框中输入“amé”
  • 客户端使用某种编码将字符串转换为字节[] (我已经尝试了所有预定义的以及一些像“iso-8859-1”这样的)
  • 客户端通过 TCP 发送 byte[]
  • 服务器接收并输出使用相同编码重新转换的字符串(到列表框)

编辑 :

我忘了提到结果字符串是“am?”。

Edit-2(根据要求,这里有一些代码):

@DJKRAZE 这里有一些代码:

byte[] buffer = Encoding.ASCII.GetBytes("amé");
(TcpClient)server.Client.Send(buffer);

在服务器端:

byte[] buffer = new byte[1024];
Client.Recieve(buffer);
string message = Encoding.ASCII.GetString(buffer);
ListBox1.Items.Add(message);

出现在列表框中的字符串是“am?”

=== 解决方案 ===

Encoding encoding = Encoding.GetEncoding("iso-8859-1");
byte[] message = encoding.GetBytes("babé");

更新:

简单地使用Encoding.Utf8.GetBytes("ééé");就像魅力一样。

4

3 回答 3

11

回答我认为的问题永远不会太晚,希望有人能在这里找到答案。

C# 使用 16 位字符,而 ASCII 将它们截断为 8 位,以适应一个字节。经过一番研究,我发现 UTF-8 是特殊字符的最佳编码。

//data to send via TCP or any stream/file
byte[] string_to_send = UTF8Encoding.UTF8.GetBytes("amé");

//when receiving, pass the array in this to get the string back
string received_string = UTF8Encoding.UTF8.GetString(message_to_send);
于 2014-09-09T02:53:59.753 回答
5

您的问题似乎是Encoding.ASCII.GetBytes("amé");andEncoding.ASCII.GetString(buffer);调用,正如他的评论中的“500 - Internal Server Error”所暗示的那样。

é字符是一个多字节字符,以 UTF-8 编码,字节序列为C3 A9。当您使用Encoding.ASCII该类进行编码和解码时,该é字符将转换为问号,因为它没有直接的 ASCII 编码。这适用于任何在 ASCII 中没有直接编码的字符。

更改要使用的代码Encoding.UTF8.GetBytes()Encoding.UTF8.GetString()它应该适合您。

于 2013-02-26T06:49:33.440 回答
0

你的问题和你的错误对我来说不是很清楚,但使用Base64String可能会解决问题
像这样

static public string EncodeTo64(string toEncode)
    {
      byte[] toEncodeAsBytes
            = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
      string returnValue
            = System.Convert.ToBase64String(toEncodeAsBytes);
      return returnValue;
    }

static public string DecodeFrom64(string encodedData)
    {
      byte[] encodedDataAsBytes
          = System.Convert.FromBase64String(encodedData);
      string returnValue =
         System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
      return returnValue;
    }
于 2013-02-26T06:25:41.727 回答