Question

Je construis un paquet de données à envoyer via NSStream à un serveur. J'essaie de séparer deux données avec le '& # 167;' (code ascii 167). C’est comme cela que le serveur est construit, je dois donc essayer de rester dans ces limites ...

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

Le résultat final devrait donc ressembler à ceci .. et il en va de même lors de la première construction de sendData:

USER User§Pass 

cependant, lorsqu'il est reçu côté serveur, il se présente comme suit:

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

... la chaîne de séparation a maintenant une longueur de deux et la dernière lettre est tronquée à partir de la commande. Je pense que cela est dû à la conversion UTF8.

Quelqu'un peut-il m'éclairer un peu?

Toute aide serait grandement appréciée!

Était-ce utile?

La solution

Le codage correct en UTF-8 pour ce caractère est la séquence de deux octets 0xC2 0xA7, qui correspond à ce que vous obtenez. ( Fileformat.info est inestimable pour ce genre de choses.) Ceci est En dehors du jeu LATIN-1, vous voudrez donc certainement utiliser NSISOLatin1StringEncoding plutôt que NSUTF8StringEncoding afin d’obtenir un codage à un octet. Regardez NSString -dataUsingEncoding: .

Autres conseils

Ce que vous avez et ce que vous voulez transmettre n'est pas vraiment une chaîne UTF-8, et ce n'est techniquement pas nous-ascii, car ce n'est que 7 bits. Vous souhaitez transmettre un tableau d'octets arbitraire, en fonction du protocole avec lequel vous travaillez. Les deux champs du tableau d'octets, nom d'utilisateur et mot de passe, peuvent être eux-mêmes des chaînes UTF-8, mais avec le séparateur 167 , il ne peut s'agir d'une chaîne UTF-8.

Voici quelques options que je vois:

  • Construisez le tableau d'octets uint8_t * en utilisant au moins deux objets NSString différents, plus le code 167 . Cela sera nécessaire si le nom d'utilisateur ou le mot de passe peut éventuellement contenir des caractères non ascii.
  • Utilisez la méthode NSString getBytes: maxLength: usedLength: encoding: options: range: rangeRange et définissez encoding sur NSASCIIStringEncoding . Si vous faites cela, vous devez valider ailleurs que votre nom d’utilisateur et votre mot de passe sont uniquement us-ascii.
  • Utilisez la méthode NSString getCString . Toutefois, cela est obsolète car vous ne pouvez pas spécifier le codage souhaité.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top