Comment obtenir HTML codé correctement dans le presse-papiers?

voix
6

Quelqu'un at-il remarqué que si vous récupérez HTML dans le presse-papiers, il obtient le mauvais encodage des caractères bizarres et injecte?

Par exemple, l'exécution d'une commande comme ceci:

string s = (string) Clipboard.GetData(DataFormats.Html)

Résultats dans des choses comme:

<FONT size=-2>  <A href=/advanced_search?hl=en>Advanced 
Search</A><BR>  <A href=/preferences?hl=en>Preferences</A><BR>  <A 
href=/language_tools?hl=en>Language 
Tools</A></FONT>

Je ne sais pas comment MarkDown traitera, mais il y a des personnages étranges dans le balisage résultant ci-dessus.

Il semble que le bug est avec le framework .NET. Que pensez-vous est la meilleure façon d'obtenir HTML correctement codé dans le presse-papiers?

Créé 27/10/2008 à 02:13
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
3

Dans ce cas , il est pas visible car il était dans mon cas. Aujourd'hui , j'ai essayé de copier les données du presse - papiers , mais il y avait quelques caractères unicode. Les données que je suis arrivé était comme si je lisais un fichier codé UTF-8 dans le codage Windows 1250 (codage local dans mon Windows) .

Il semble que vous le cas est le même. Si vous enregistrez les données HTML (souvenez - vous de mettre l' espace non sécable = 0xA0 après le caractère Â, pas un espace standard) dans Windows 1252 (ou Windows 1250, les deux œuvres) . Ensuite , ouvrez ce fichier comme un fichier UTF-8 et vous verrez ce que devrait y avoir.

Pour mon autre projet, je fait une fonction qui fixe les données avec le codage corrompu.

Dans ce cas, la conversion simple devrait être suffisante:

byte[] data = Encoding.Default.GetBytes(text);
text = Encoding.UTF8.GetString(data);

Ma fonction d'origine est un peu plus complexe et contient des tests pour vérifier que les données ne sont pas corrompus ...

public static bool FixMisencodedUTF8(ref string text, Encoding encoding)
{
  if (string.IsNullOrEmpty(text))
    return false;
  byte[] data = encoding.GetBytes(text);
  // there should not be any character outside source encoding
  string newStr = encoding.GetString(data);
  if (!string.Equals(text, newStr)) // if there is any character "outside"
    return false; // leave, the input is in a different encoding
  if (IsValidUtf8(data) == 0) // test data to be valid UTF-8 byte sequence
    return false; // if not, can not convert to UTF-8
  text = Encoding.UTF8.GetString(data);
  return true;
}

Je sais que ce n'est pas le meilleur (ou d'une solution correcte) mais je ne l' ai pas trouvé d'autre moyen comment fixer l'entrée ...

EDIT : (20 Juillet, 2017)

Il semble que Microsoft a déjà trouvé cette erreur et maintenant il fonctionne correctement. Je ne sais pas si le problème est dans certains cadres, mais je sais que, maintenant que l'application utilise un cadre différent comme dans le temps, quand j'ai écrit la réponse. (Maintenant , il est de 4,5, la version précédente était de 2,0) (Maintenant tout mon code échoue dans l' analyse des données Il y a un autre problème pour déterminer le comportement correct pour une application avec correction déjà aplied et sans solution..)

Créé 28/09/2013 à 16:07
source utilisateur

voix
1

Vous devez interpréter les données UTF-8. Voir les liens hypertexte MS Office changer la page de code? .

Créé 27/10/2008 à 06:41
source utilisateur

voix
0

DataFormats.Html spécification indique qu'il est codé en UTF-8. Mais il y a un bogue dans .NET Framework 4 et inférieur, et il lit effectivement en UTF-8 comme Windows 1252 .

Vous obtenez attribuer des encodages mal, leader des personnages drôles / mauvais tels que 'A', 'â € ¹', 'A' ' '½', 'Å¡',' Å « ' '¾',' å », 'Â', '¡', ' ¢', ' £', '¤', ' ¥', 'Â|', '§', 'a', ' ©'

Une explication complète ici Graphique Débogage Cartographie Windows 1252 caractères UTF-8 octets Latin-1 caractères

Soln: Créer un dictionnaire de traduction et rechercher et remplacer.

Créé 28/06/2016 à 05:47
source utilisateur

voix
0

Essaye ça

System.Windows.Forms.Clipboard.GetText (System.Windows.Forms. TextDataFormat .html);

Créé 15/04/2015 à 22:58
source utilisateur

voix
0

Je ne sais pas ce que votre document source d'origine est, mais sachez que Word et Outlook fournissent plusieurs versions du presse-papiers dans différents encodages. L'un est généralement Windows 1252 et un autre est UTF-8. Peut-être vous saisir l'UTF-8 version codée par défaut, lorsque vous vous attendez à Windows-1252 (Latin-1 + Smart Quotes)? Les caractères non-ASCII se présenteraient comme plusieurs impairs caractères accentués Latin-1. La plupart des « Smart Quotes » ne sont pas dans l'ensemble Latin-1 et sont souvent trois octets en UTF-8.

Pouvez-vous préciser quel codage vous voulez le contenu du presse-papiers dans?

Créé 08/07/2013 à 18:15
source utilisateur

voix
0

Voici le script PowerShell vous pouvez modifier le presse-papiers pour changer les problèmes d'encodage.

http://www.johndcook.com/blog/2008/10/17/manipulating-the-clipboard-with-powershell/

Créé 27/10/2008 à 03:41
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more