Busqué en Google sobre este tema y miré todas las respuestas, pero todavía no lo entiendo.
Básicamente, necesito convertir la cadena UTF-8 a ISO-8859-1 y lo hago usando el siguiente código:
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
string msg = iso.GetString(utf8.GetBytes(Message));
Mi cadena de origen es
Message = "ÄäÖöÕõÜü"
Pero desafortunadamente mi cadena de resultados se convierte en
msg = "�ä�ö�õ�ü
¿Qué estoy haciendo mal aquí?
Encoding.Unicode
la API de Win32. Unicode es un conjunto de caracteres, no una codificación. UTF-16 es una de varias codificaciones para Unicode).Message
fue decodificado de UTF-8. Suponiendo que esa parte funcionó correctamente, convertir a Latin-1 es tan simple comobyte[] bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(Message)
. Luego, como dice StuS, puede convertir los bytes Latin-1 nuevamente a UTF-16 conEncoding.GetEncoding("ISO-8859-1").GetString(bytes)
Respuestas:
Utilice Encoding.Convert para ajustar la matriz de bytes antes de intentar decodificarla en su codificación de destino.
fuente
Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8.GetBytes(myString)))
Creo que su problema es que asume que los bytes que representan la cadena utf8 resultarán en la misma cadena cuando se interpreten como otra cosa (iso-8859-1). Y ese simplemente no es el caso. Te recomiendo que leas este excelente artículo de Joel spolsky.
fuente
Prueba esto:
fuente
Necesita arreglar la fuente de la cadena en primer lugar.
Una cadena en .NET es en realidad solo una matriz de caracteres, puntos de código Unicode de 16 bits, por lo que una cadena no tiene ninguna codificación en particular.
Es cuando tomas esa cadena y la conviertes en un conjunto de bytes que entra en juego la codificación.
En cualquier caso, la forma en que lo hizo, codificó una cadena en una matriz de bytes con un conjunto de caracteres y luego la decodificación con otro, no funcionará, como puede ver.
¿Puede decirnos más sobre el origen de esa cadena original y por qué cree que se ha codificado mal?
fuente
Parece un código un poco extraño. Para obtener una cadena del flujo de bytes Utf8, todo lo que necesita hacer es:
Si necesita guardar el flujo de bytes iso-8859-1 en algún lugar, simplemente use: línea adicional de código para el anterior:
fuente
Solo usé la solución de Nathan y funciona bien. Necesitaba convertir ISO-8859-1 a Unicode:
fuente
fuente
Aquí hay una muestra para ISO-8859-9;
fuente