c# - especiales - formato utf-8
Obtener datos CSV desde el portapapeles(pegado desde Excel) que contiene caracteres acentuados (2)
Excel almacena la cadena en el portapapeles utilizando la codificación de caracteres Unicode. La razón por la que obtienes un cuadrado cuando intentas leer la cadena en ANSI es que no hay representación para ese carácter en la página de códigos ANSI de tu sistema. Deberías simplemente usar Unicode. Si va a tener que lidiar con problemas de localización, entonces ANSI es solo más problemas de lo que vale.
Editar: Joel Spolsky escribió una excelente introducción a las codificaciones de caracteres, que definitivamente vale la pena echarle un vistazo: El mínimo absoluto Todo desarrollador de software Absolutamente, definitivamente debe saber sobre Unicode y juegos de caracteres (¡Sin excusas!)
GUIÓN
- Mis usuarios copiarán celdas de Excel (colocándolas en el portapapeles)
- Y mi aplicación recuperará esas celdas del portapapeles
EL PROBLEMA
- Mi código recupera el formato CSV del portapapeles
- Sin embargo, si el contenido original de Excel contiene caracteres como ä (a con diéresis), la cadena CSV recuperada no tiene los caracteres correctos (ä termina mostrándome como un "cuadrado" para mí)
- En comparación, si mi código recupera el formato de texto Unicode del portapapeles todo funciona bien: ä se conserva en la cadena recuperada del portapapeles
CÓDIGO FUENTE - ORIGINAL - CON EL PROBLEMA
[STAThread]
static void Main(string[] args)
{
var fmt_csv = System.Windows.Forms.DataFormats.CommaSeparatedValue;
// read the CSV
var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
var stream = (System.IO.Stream)dataobject.GetData(fmt_csv);
var enc = new System.Text.UTF8Encoding();
var reader = new System.IO.StreamReader(stream,enc);
string data_csv = reader.ReadToEnd();
// read the unicode string
string data_string = System.Windows.Forms.Clipboard.GetText();
}
LOS RESULTADOS AL EJECUTAR EL CÓDIGO DE MUESTRA
- Pasos de reproducción: ingrese un texto en Excel (utilicé la palabra "doppelgänger" más algunos números) y simplemente presione Ctrl-C para copiarlo en el portapapeles y luego ejecute el código anterior.
- data_csv está establecido en "doppelg nger, 1 / r / n2,3 / r / n / 0"
- data_string está establecido en "doppelgänger / t1 / r / n2 / t3 / r / n"
PREGUNTA
- ¿Qué puedo hacer para obtener los personajes correctos?
COMENTARIOS
- Sí, sé que podría solucionar este problema utilizando el texto Unicode. Pero en realidad quiero entender qué está pasando con el CSV
- el uso o no de la codificación UTF-8 al recuperar el flujo no hace ninguna diferencia en los resultados
LA RESPUESTA
Después de mirar los comentarios y prestar mucha atención a lo que Excel estaba colocando en el portapapeles para CSV, parecía razonable que Excel pudiera colocar los contenidos usando una codificación "heredada" en lugar de UTF-8. Así que probé usando la página de códigos de Windows 1252 como codificación y funcionó. Vea el código a continuación
CÓDIGO FUENTE - CON LA RESPUESTA
[STAThread]
static void Main(string[] args)
{
var fmt_csv = System.Windows.Forms.DataFormats.CommaSeparatedValue;
//read the CSV
var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
var stream = (System.IO.Stream)dataobject.GetData(fmt_csv);
var enc = System.Text.Encoding.GetEncoding(1252);
var reader = new System.IO.StreamReader(stream,enc);
string data_csv= reader.ReadToEnd();
//read the Unicode String
string data_string = System.Windows.Forms.Clipboard.GetText();
}
Tu codificación de la transmisión como UTF8 no está funcionando. Los bytes para la diéresis se están convirtiendo en el carácter unicode "carácter de reemplazo".
En su lugar, solo mira los datos de la secuencia sin ninguna instrucción de codificación adicional. Los datos estarán en algún formato establecido utilizado por Excel. Debería poder verlo mirando el (los) octeto (s) donde está el desvinculación. Debería poder convertirlo a UTF-8.
El peor caso es si el formateador CSV arroja todo lo que no es Ascii. En ese caso, es posible que pueda escribir su propio formateador de datos.
En algunos casos, la gente de Excel ha pensado que CSV solo significa Ascii. Ver http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.misc/2008-07/msg02270.html