質問

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変換が原因であると考えています。

誰かがこれについて私に光を当てることができますか?

ご協力いただければ幸いです!

役に立ちましたか?

解決

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

他のヒント

あなたが持っているものと送信したいものは実際にはUTF-8文字列ではなく、技術的にはus-asciiではありません。それはたった7ビットだからです。使用しているプロトコルに応じて、バイトの任意の配列を送信したい。バイト配列の2つのフィールド、ユーザー名とパスワードは、それ自体がUTF-8ストリングである場合がありますが、 167 セパレーターではUTF-8ストリングにすることはできません。

ここにいくつかのオプションがあります:

  • 少なくとも2つの異なる NSString オブジェクトと 167 コードを使用して、 uint8_t * バイト配列を構築します。これは、ユーザー名またはパスワードに非ASCII文字が含まれている可能性がある場合に必要になります。
  • NSString メソッド getBytes:maxLength:usedLength:encoding:options:range:remainingRange を使用し、 encoding NSASCIIStringEncoding <に設定します/ code>。これを行う場合、ユーザー名とパスワードがus-asciiのみであることを他の場所で検証する必要があります。
  • NSString メソッド getCString を使用します。ただし、必要なエンコードを指定できないため、非推奨になりました。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top