8

TcpClient (byte[]) を介して特殊文字を含む文字列を送信しようとしています。次に例を示します。

  • クライアントはテキストボックスに「アメ」と入力します
  • クライアントは、特定のエンコーディングを使用して文字列を byte[] に変換します(定義済みのものと「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

5

あなたの問題は、彼のコメントの「500 - 内部サーバー エラー」で示唆されているようにEncoding.ASCII.GetBytes("amé");、呼び出しのようです。Encoding.ASCII.GetString(buffer);

このé文字は、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 に答える