C# 通过TCP客户端发送包含特殊字符的字符串(字节[])

C# 通过TCP客户端发送包含特殊字符的字符串(字节[]),c#,.net,encoding,tcp,special-characters,C#,.net,Encoding,Tcp,Special Characters,我试图通过TcpClient(字节[])发送包含特殊字符的字符串。下面是一个例子: 客户端在文本框中输入“amé” 客户端使用特定的编码将字符串转换为字节[](我已经尝试了所有预定义的编码,还有一些类似于“iso-8859-1”) 客户端通过TCP发送字节[] 服务器接收并输出使用相同编码重新转换的字符串(到列表框) 编辑: 我忘了提到结果字符串是“am?” 编辑-2(根据要求,这里有一些代码): @DJKRAZE这里有一些代码: byte[] buffer = Encoding.ASCII

我试图通过TcpClient(字节[])发送包含特殊字符的字符串。下面是一个例子:

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

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

编辑-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(“俎俎”)
工作起来很有魅力。

我不清楚您的问题和错误,但使用
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;
    }

您的问题似乎是
编码.ASCII.GetBytes(“amé”)
编码.ASCII.GetString(缓冲区)调用,正如他评论中的“500-内部服务器错误”所暗示的那样

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


将您的代码更改为使用
Encoding.UTF8.GetBytes()
Encoding.UTF8.GetString()
,它应该适用于您。

我想回答一个问题永远不会太迟,希望有人能在这里找到答案

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);

Philippe您是否有现有代码?为什么人们在网上问问题,希望我们知道他们在说什么。。?我们看不到你在做什么,也不知道你的代码是什么样子。。因此,发布您正在使用的内容…@DJKRAZE这里有一段代码:byte[]buffer=Encoding.ASCII.GetBytes(“amé”);(TcpClient)server.Client.Send(缓冲区);在服务器端:byte[]buffer=新字节[1024];客户端接收(缓冲);字符串消息=Encoding.ASCII.GetString(缓冲区);ListBox1.Items.Add(消息);列表框中显示的字符串为“am?”ASCII在此处不起作用-它不支持重音字符。请改用UTF-8。@500 InternalServerError尝试了所有预定义的,包括UTF-8..:如果你去掉中间人(插座连接),它能与UTF-8一起工作吗。。。我得到的错误是字符串不在base64中…好吧!找到了解决这个大问题的方法。我现在使用的是“iso-8859-1”编码。这里有一些代码供对未来感兴趣的人使用。Encoding Encoding=Encoding.GetEncoding(“iso-8859-1”);byte[]message=encoding.GetBytes(“babé”);结果服务器端:“宝贝”!不管怎样,谢谢你的回答:)你说你已经试过了,但没有用。改变了什么?没有。C#的
char
数据类型包含一个UTF-16代码单元,其中一个或两个编码一个Unicode码点。UTF-8将Unicode码点编码为1到4个字节。使用哪种编码无关紧要,只要两侧使用相同的编码,并且编码不会因为无法表示所需的字符而导致数据丢失。如果不能,GetBytes()将采取一些操作。标准操作是替换“?”;抛出异常也很常见;截断并不常见,但如果你想造成数据损坏,可以用这种方式编码。Scott,很明显,我在代码中还出了其他错误。Utf-8编码在两边都使用时效果非常好。我更新了这个问题,这样人们就不会误会我说utf-8不起作用。汤姆,我的意思是,不管C#如何存储字符本身,它都是2个字节,因此ascii对特殊字符如“é”@PhilippeParé没有帮助,汤姆说的是C#在内部使用utf-16,大小可能是2或4个字节。例如,
U+1D11E
()是可表示的,但它将是内存中的四个字节
D8 34 DD 1E