Dans notre API, nous utilisons byte [] pour envoyer des données sur le réseau. Tout a bien fonctionné, jusqu'au jour où nos clients "étrangers" ont décidé de passer/recevoir des caractères Unicode. Autant que je sache, les caractères Unicode occupent 2 octets, cependant, nous allouons seulement 1 octet dans le tableau d'octets pour eux.Conversion d'un caractère unicode de l'octet
Voici comment nous lisons le caractère de l'octet [] tableau:
// buffer is a byte[6553] and index is a current location in the buffer
char c = System.BitConverter.ToChar(buffer, m_index);
index += SIZEOF_BYTE;
return c;
Donc, la question actuelle est l'API reçoit un étrange caractère Unicode, quand je regarde le hexadécimal Unicode. J'ai trouvé que le dernier octet significatif est correct, mais l'octet le plus significatif a une valeur quand il est censé être 0. Une solution de contournement rapide, jusqu'à présent, a été de 0x00FF & c pour filtrer le msb.
Veuillez suggérer la bonne approche pour gérer les caractères Unicode provenant de la socket?
Merci.
Solution:
Bravo à Jon:
char c = (char) Tampon [m_index]; Et comme il l'a mentionné, la raison pour laquelle cela fonctionne, c'est parce que le client api reçoit un caractère occupant seulement un octet, et BitConverter.ToChar en utilise deux, d'où le problème de sa conversion. Je suis toujours surpris de voir pourquoi cela a fonctionné pour certains personnages et pas pour les autres, car cela aurait dû échouer dans tous les cas.
Merci les gars, bonnes réponses!
"Autant que je sache, les caractères Unicode occupent 2 octets" c'est faux. la meilleure simplification est de penser que "ASCII est obsolète, les bytestreams de texte sont UTF8", et par conséquent toujours faire un encodage/décodage pour convertir interne à/de UTF8 chaque fois que vous les sortez/dans votre application. – Javier
Cette simplification est fausse, car elle suppose UTF-8 partout - ce qui n'est * certainement * pas le cas. Oui, UTF-8 est très commun, mais supposer qu'il est omniprésent est une erreur. La meilleure attitude n'est pas de simplifier du tout: vous devez toujours connaître l'encodage lorsque vous codez/décodez. Ne présumez pas. –
Dans ce cas, je ne suppose pas, comme j'ai regardé le code côté serveur, et vu qu'il est en effet envoyer un caractère emballé en 1 octet (sans aucun encodage). Néanmoins, je suis d'accord qu'un codage correct devrait être étudié avant l'encodage/décodage. Merci –