2008-10-27 22 views
6

¿Alguien ha notado que si recupera HTML del portapapeles, obtiene la codificación incorrecta e inyecta caracteres extraños?¿Cómo obtener el código HTML correctamente codificado del portapapeles?

Por ejemplo, la ejecución de un comando como este:

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

Resultados de cosas por el estilo:

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

No seguro de cómo MarkDown procesará esto, pero hay caracteres extraños en el margen de beneficio resultante encima.

Parece que el error está en el .NET framework. ¿Cuál crees que es la mejor manera de obtener HTML codificado correctamente desde el portapapeles?

Respuesta

0

No sé cuál es su documento fuente original, pero tenga en cuenta que Word y Outlook proporcionan varias versiones del portapapeles en diferentes codificaciones. Uno es usualmente Windows-1252 y otro es UTF-8. Posiblemente está tomando la versión codificada UTF-8 de forma predeterminada, cuando está esperando el Windows-1252 (Latin-1 + Smart Quotes)? Los caracteres que no sean ASCII aparecerían como múltiples caracteres acentuados latinos impares. La mayoría de las "citas inteligentes" no están en el conjunto de Latin-1 y a menudo tienen tres bytes en UTF-8.

¿Puede especificar en qué codificación desea que esté el contenido del portapapeles?

3

En este caso, no es tan visible como en mi caso. Hoy traté de copiar datos del portapapeles, pero había algunos caracteres Unicode. Los datos que obtuve fueron como si quisiera leer un archivo codificado en UTF-8 en la codificación de Windows-1250 (codificación local en mi Windows).

Parece que su caso es el mismo. Si guarda los datos html (recuerde poner espacio no rompible = 0xa0 después del carácter Â, no un espacio estándar) en Windows-1252 (o Windows-1250; ambos funcionan). A continuación, abra este archivo como un archivo UTF-8 y verá lo que debería ser.

Para mi otro proyecto hice una función que corrige datos con codificación corrupta.

En este caso simple conversión debe ser suficiente:

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

Mi función original es un poco más compleja y contiene pruebas para asegurarse de que los datos no están dañados ...

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

I sé que este no es el mejor (o la solución correcta) pero no encontré otra manera de cómo corregir la entrada ...

EDITAR: (20 de julio 2017)

parece que el Microsoft ya encontró este error y ahora funciona correctamente. No estoy seguro de si el problema está en algunos marcos, pero estoy seguro, que ahora la aplicación usa un marco diferente a tiempo, cuando escribí la respuesta. (Ahora es 4.5, la versión anterior era de 2,0)

(Ahora todo mi código falla en el análisis de los datos Existe otro problema para determinar el comportamiento correcto para su aplicación con arreglo ya APLICADA y sin solución.).
0

probar este

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

0

DataFormats.Htmlspecification indica que está codificado en UTF-8. Pero hay un error en .NET 4 Framework y más bajo, y en realidad se lee como UTF-8 como Windows-1252.

Obtiene un montón de codificaciones incorrectas, lo que lleva caracteres divertidos/malos como 'Å', '' ',' Å '', 'Ž', 'Å' ',' Å '', 'ž ',' Ÿ ','  ',' ¡ ','  ¢ ','  £ ',' ¤ ','  ¥ ',' Â| ',' § ',' ¨ ' , ' ©'

explicación completa aquí Debugging Chart Mapping Windows-1252 Characters to UTF-8 Bytes to Latin-1 Characters

Soln: Crear un diccionario de traducción y de buscar y reemplazar.

Cuestiones relacionadas