Как получить правильно закодированный HTML из буфера обмена? - PullRequest
6 голосов
/ 27 октября 2008

Кто-нибудь заметил, что если вы извлекаете HTML из буфера обмена, он неправильно использует кодировку и вводит странные символы?

Например, выполнив такую ​​команду:

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

Результаты в таких вещах, как:

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

Не уверен, как MarkDown будет это обрабатывать, но в результирующей разметке выше есть странные символы.

Похоже, ошибка связана с платформой .NET. Как вы думаете, что является лучшим способом получить правильно закодированный HTML из буфера обмена?

Ответы [ 6 ]

3 голосов
/ 28 сентября 2013

В данном случае это не так заметно, как в моем случае. Сегодня я попытался скопировать данные из буфера обмена, но было несколько символов Юникода. Я получил данные, как если бы я читал файл в кодировке UTF-8 в кодировке Windows-1250 (локальная кодировка в моей Windows) .

Кажется, ваш случай тот же. Если вы сохраняете html-данные (не забудьте поставить неразрывный пробел = 0xa0 после символа Â, а не стандартного пробела) в Windows-1252 (или Windows-1250; оба работают) . Затем откройте этот файл как файл UTF-8, и вы увидите, что там должно быть.

Для моего другого проекта я сделал функцию, которая исправляет данные с поврежденной кодировкой.

В этом случае достаточно простого преобразования:

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

Моя первоначальная функция немного сложнее и содержит тесты, чтобы убедиться, что данные не повреждены ...

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

Я знаю, что это не самое лучшее (или правильное решение) , но я не нашел другого способа исправить входные данные ...

РЕДАКТИРОВАТЬ : (20 июля 2017 г.)

Похоже, что Microsoft уже нашла эту ошибку, и теперь она работает правильно. Я не уверен, что проблема в каких-то фреймворках, но я точно знаю, что теперь приложение использует другой фреймворк, как во время, когда я писал ответ. (сейчас это 4.5; предыдущая версия была 2.0) (Теперь весь мой код не может выполнить синтаксический анализ данных. Есть еще одна проблема, связанная с определением правильного поведения приложения с уже исправленным исправлением и без исправления.)

1 голос
/ 27 октября 2008

Вы должны интерпретировать данные как UTF-8. См. MS Office гиперссылки изменить кодовую страницу? .

0 голосов
/ 28 июня 2016

DataFormats.Html спецификация гласит, что кодируется в UTF-8. Но есть ошибка в .NET 4 Framework и ниже, и она на самом деле читается как UTF-8 как Windows-1252 .

Вы получаете множество неправильных кодировок, ведущих смешные / плохие символы, такие как 'A', 'â € ¹', 'A' ' 'Ž', 'a¡',' А « ' 'ž', 'A', 'A', 'a¡','  ¢ », ' £', '¤', ' ¥', 'Â|', '§', 'A', ' ©'

Полное объяснение здесь Диаграмма отладки, сопоставляющая символы Windows-1252 с байтами UTF-8 и символы Latin-1

Soln: создание словаря перевода, поиск и замена.

0 голосов
/ 16 апреля 2015

Попробуйте это

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

0 голосов
/ 08 июля 2013

Я не знаю, какой у вас исходный документ, но учтите, что Word и Outlook предоставляют несколько версий буфера обмена в разных кодировках. Один обычно Windows-1252, а другой UTF-8. Возможно, вы захватываете версию в кодировке UTF-8 по умолчанию, когда ожидаете Windows-1252 (Latin-1 + Smart Quotes)? Символы, не входящие в ASCII, будут отображаться как несколько нечетных символов с латинскими цифрами 1. Большинство «умных кавычек» не входят в набор Latin-1 и часто составляют три байта в UTF-8.

Можете ли вы указать, в какой кодировке вы хотите содержимое буфера обмена?

0 голосов
/ 27 октября 2008

Вот скрипт PowerShell, который вы можете изменить в буфере обмена, чтобы изменить любые проблемы с кодировкой.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...