2009-09-26 6 views
1

J'ai recherché ici des posts sur Stack Overflow, et j'ai lu le post sur le codage de JoelOnSoftware, et j'ai maintenant une bonne compréhension des problèmes d'encodage. Mais je rencontre un problème avec certains encodages de caractères provenant du presse-papiers de Windows. Le test reproductible consiste à utiliser IE et à sélectionner et à copier le texte "Programmes publicitaires" sur la page d'accueil de Google.Problème d'encodage C# UTF-8

J'utilise le code C# suivant pour tirer ce texte hors le presse-papiers (vérification d'erreurs supprimé):

uint FormatId = GetRegisteredClipboardFormatId("HTML Format"); 
IntPtr hHtml = Win32.GetClipboardData(FormatId); 
uint DataSize = Win32.GlobalSize(hHtml); 
byte[] HtmlData = new byte[DataSize]; 
IntPtr pData = Win32.GlobalLock(hHtml); 
Marshal.Copy(pData, HtmlData, 0, (int)DataSize); 
Win32.GlobalUnlock(hHtml); 

Les données HTML du presse-papiers est censé être UTF-8 codé, donc j'utiliser ce qui suit pour convertir les données en une chaîne:

string Content = Encoding.UTF8.GetString(HtmlData); 

Cependant, en ignorant les balises HTML environnants, ce que cela entraîne est:

« Programmes » AdvertisingÂSuis-je en train de faire quelque chose de mal, de mal comprendre quelque chose ou le problème se situe-t-il ailleurs?

Merci pour toute aide!

Répondre

6

Vous affichez UTF-8 en tant que Latin-1 ou ses variantes (CP1252).

Google utilise un nbsp dans cette phrase, qui est C2 A0, qui se trouve être " " dans Latin-1.

EDIT: Le code que vous avez montré ici est correct. Je pense que le problème se produit lorsque vous affichez le content. On dirait que vous êtes sortie UTF-8 mais le support d'affichage attend Latin-1.

Si vous utilisez la console pour afficher, essayer,

Console.OutputEncoding = Encoding.GetEncoding("iso-8859-1"); 

Cela indiquera la console d'envoyer Latin-1, au lieu de UTF-8.

Si vous affichez le texte dans les navigateurs, assurez-vous que la page Web est marquée par UTF-8, comme,

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
+0

Eh bien, je suppose que cela conduit à deux questions: 1. Si la classe de codage sait qu'il prend en UTF-8 et en sortie une chaîne Unicode (UTF-16?), ne devrait-il pas savoir comment traduire C2 A0 en UTF-8 à la représentation correcte de   en Unicode? Je suppose que je ne comprends pas le problème de l'encodage à un niveau basique. Désactivé pour faire plus de recherches ... 2. Je vais finalement encoder la chaîne en UTF-8 pour la rendre dans un navigateur. Je convertis uniquement en une chaîne .NET pour faciliter l'analyse. Existe-t-il un meilleur moyen d'analyser le texte dans son encodage UTF-8 natif? –

+0

Voir mes modifications ..................... –

+0

Excellent! Cela a fait l'affaire - merci beaucoup pour le pointeur! –

0

Vérifiez le code HTML. Il y a "&nbsp;" entre "Publicité" et "Programmes". Essayez votre code avec le texte "Business Solutions" et cela va fonctionner.

Vous devrez probablement remplacer nbsp par un espace normal.