2011-05-17 5 views
9

Pour ce morceau de code:encodage des caractères

String content = String.Empty; 
ListenerStateObject state = (ListenerStateObject)ar.AsyncState; 
Socket handler = state.workSocket; 

int bytesRead = handler.EndReceive(ar); 

if (bytesRead > 0) 
{ 
    state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead)); 

    content = state.sb.ToString(); 
    ... 

Je suis geting 'Ol? au lieu de 'Olá'

Qu'est-ce qui ne va pas?

+4

Vos données ne sont probablement pas UTF8. – driis

+0

Mieux montrer le contenu exact de state.buffer, et bytesRead –

Répondre

1

Etes-vous sûr que le flux est effectivement encodé en utf-8? Essayez d'inspecter les octets bruts dans le tampon avant l'encodage (il devrait y en avoir 4) et voyez quelles sont les valeurs réelles des octets.

+0

Le 'á' est avec la valeur 63 donc c'est pourquoi il montre '?' – RedEagle

+0

@RedEagle: L'octet 63 * avant * l'encodage se produit-il? Ensuite, votre programme fonctionne correctement puisque l'entrée est vraiment "Ol?", Mais le flux est tronqué avant qu'il n'atteigne votre code. – JacquesB

+0

Comme il se trouve que le flux était ASCII encodend au lieu de UTF-8, même si j'étais totalement convaincu qu'il l'était déjà. Merci pour la réponse helpfull – RedEagle

4

Très probablement, le codage est incorrect. Mais si vous utilisez ce code pour recevoir des blocs d'octets (séparés par un protocole), vous aurez un sérieux défaut: il n'y a aucune garantie que le bloc a été codé indépendamment.

Cas simple: la limite de 2 blocs coupe un caractère codé sur plusieurs octets.

Meilleure solution: Attachez un TextReader à votre flux.

-1

Est-ce que vous produisez le résultat dans quelque chose qui comprend l'encodage 'complexe'?

+0

Le résultat est une chaîne .NET, rien codé/complexe à ce sujet. –