1

NSStream を介してサーバーに送信されるデータ パケットを作成しています。2 つのデータを '§' (ASCII コード 167) で区切ろうとしています。これがサーバーの構築方法であるため、これらの境界内にとどまるようにする必要があります...

unichar asciiChar = 167;  //yields @"§"
[self setSepString:[NSString stringWithCharacters:&asciiChar length:1]]; 

sendData=[NSString stringWithFormat:@"USER User%@Pass", sepString];

NSLog(sendData);

const uint8_t *rawString=(const uint8_t *)[sendData UTF8String];

[oStream write:rawString maxLength:[sendData length]];  

したがって、最終的な結果は次のようになります..そして、sendData が最初に構築されたときです:

USER User§Pass 

ただし、サーバー側で受信すると、次のようになります。

//not a direct copy and paste. The 'mystery character' may not be exact
USER UserˤPas

...区切り文字列の長さが 2 になり、最後の文字がコマンドから切り取られています。これはUTF8変換が原因だと思います。

誰かが私のためにこれに光を当てることができますか?

どんな助けでも大歓迎です!

4

2 に答える 2

6

この文字の UTF-8 での正しいエンコードは、2 バイト シーケンス 0xC2 0xA7 であり、これが得られます。( Fileformat.infoは、このようなものには非常に貴重です。) これは LATIN-1 セットの外にあるため、シングルバイトの 167 エンコーディングを取得するには、ほぼ確実に NSUTF8StringEncoding ではなく NSISOLatin1StringEncoding を使用する必要があります。を見てくださいNSString -dataUsingEncoding:

于 2009-06-16T17:30:14.387 に答える
1

あなたが持っているものとあなたが送信したいものは実際にはUTF-8文字列ではなく、技術的には私たち-アスキーではありません。それはたった7ビットだからです。使用しているプロトコルに従って、任意のバイト配列を送信する必要があります。バイト配列の2つのフィールド、usernameとpasswordは、それ自体がUTF-8文字列である可能性がありますが、167区切り文字を使用すると、UTF-8文字列にすることはできません。

これが私が見るいくつかのオプションです:

  • uint8_t*少なくとも2つの異なるNSStringオブジェクトと167コードを使用してバイト配列を作成します。これは、ユーザー名またはパスワードにASCII以外の文字が含まれている可能性がある場合に必要になります。
  • NSStringメソッドを使用してgetBytes:maxLength:usedLength:encoding:options:range:remainingRange、に設定encodingNSASCIIStringEncodingます。これを行う場合は、ユーザー名とパスワードがus-asciiのみであることを他の場所で検証する必要があります。
  • NSStringメソッドを使用しgetCStringます。ただし、必要なエンコーディングを指定できないため、これは非推奨になりました。
于 2009-06-16T17:22:02.243 に答える