NSStream、UTF8String& NSString…乱雑な変換
質問
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
を使用します。ただし、必要なエンコードを指定できないため、非推奨になりました。