Como se HTML corretamente codificados da área de transferência?

votos
6

Alguém já reparou que se você recuperar HTML da área de transferência, ele recebe a codificação errada e injeta caracteres estranhos?

Por exemplo, a execução de um comando como este:

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

Resulta em coisas como:

<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>

Não sei como MarkDown vai processar este, mas há caracteres estranhos na marcação resultando acima.

Parece que o bug é com o .NET framework. O que você acha que é a melhor maneira de obter HTML corretamente codificados da área de transferência?

Publicado 27/10/2008 em 02:13
fonte usuário
Em outras línguas...                            


6 respostas

votos
0

Aqui está PowerShell script que você pode modificar para a área de transferência para alterar quaisquer problemas de codificação.

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

Respondeu 27/10/2008 em 03:41
fonte usuário

votos
1

Você tem que interpretar os dados como UTF-8. Veja hyperlinks MS Office alterar página de código? .

Respondeu 27/10/2008 em 06:41
fonte usuário

votos
0

Eu não sei o que o seu documento original é, mas esteja ciente de que o Word e Outlook fornecer várias versões da área de transferência em diferentes codificações. Um deles é geralmente o Windows-1252 e outro é UTF-8. Possivelmente você está agarrando a versão UTF-8 codificado por padrão, quando você está esperando do Windows-1252 (Latin-1 + aspas inglesas)? caracteres não-ASCII iria aparecer como vários Latin-1 caracteres acentuados ímpares. A maioria dos "aspas inglesas" não estão no conjunto de Latin-1 e muitas vezes são três bytes em UTF-8.

você pode especificar qual codificação você deseja que o conteúdo da área de transferência em?

Respondeu 08/07/2013 em 18:15
fonte usuário

votos
3

Neste caso, não é tão visível como era no meu caso. Hoje eu tentei copiar dados de área de transferência, mas havia alguns caracteres Unicode. Os dados que eu tenho foram como se eu iria ler um arquivo codificado UTF-8 em codificação Windows-1250 (codificação local no meu Windows) .

Parece que você caso é o mesmo. Se você salvar os dados HTML (lembre-se de colocar espaço não-quebrável = 0xa0 após o caractere Â, não um espaço standard) no Windows-1252 (ou Windows-1250, ambas as obras) . Em seguida, abra o arquivo como um arquivo UTF-8 e você vai ver o que deveria haver.

Para o meu outro projeto que eu fiz uma função que corrigir dados com codificação corrompido.

Neste caso simples conversão deve ser suficiente:

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

Minha função original é um pouco mais complexo e contém testes para garantir que os dados não estão corrompidos ...

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;
}

Eu sei que esta não é a melhor (ou correta solução) , mas eu não encontrei qualquer outra forma como corrigir a entrada ...

EDIT : (20 de julho de 2017)

Parece que a Microsoft já encontrou este erro e agora ele funciona corretamente. Eu não tenho certeza se o problema está em algumas estruturas, mas eu sei com certeza, que agora o aplicativo usa uma estrutura diferente como no tempo, quando escrevi a resposta. (Agora é 4,5; a versão anterior foi de 2,0) (Agora todo o meu código falha em analisar os dados Há um outro problema para determinar o comportamento correto para aplicação com correção já aplied e sem correção..)

Respondeu 28/09/2013 em 16:07
fonte usuário

votos
0

tente este

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

Respondeu 15/04/2015 em 22:58
fonte usuário

votos
0

DataFormats.Html especificação afirma que está codificado em UTF-8. Mas há um bug no .NET Framework 4 e inferior, e ele realmente lê como UTF-8 como o Windows-1252 .

Você começa coloc de codificações erradas, levando / personagens maus engraçados, como 'a', 'â € ¹', 'A' ' '½', ' ¡',' A “ ' '¾',' A ', 'A', ' ¡', ' ¢', 'a £', 'å¤', ' ¥', 'Â|', '§', 'A', 'A ©'

Explicação completa aqui Personagens Depuração Gráfico Mapeamento do Windows-1252 para UTF-8 bytes para latino-1 Personagens

Soln: Criar um dicionário de tradução e de busca e substituir.

Respondeu 28/06/2016 em 05:47
fonte usuário

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