NSStream, UTF8String & amp; NSString & # 8230; Conversion malpropre
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!
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 objetsNSString
différents, plus le code167
. 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éfinissezencoding
surNSASCIIStringEncoding
. 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é.