C# Converteer string van UTF-8 naar ISO-8859-1 (Latin1) H

Ik heb gegoogled op dit onderwerp en ik heb elk antwoord bekeken, maar ik snap het nog steeds niet.

In principe moet ik de UTF-8-string converteren naar ISO-8859-1 en ik doe dit met de volgende code:

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
string msg = iso.GetString(utf8.GetBytes(Message));

Mijn brontekenreeks is

Message = "ÄäÖöÕõÜü"

Maar helaas wordt mijn resultaatreeks

msg = "�ä�ö�õ�ü

Wat doe ik hier verkeerd?


Antwoord 1, autoriteit 100%

Gebruik Encoding.Convertom aan te passen de byte-array voordat u deze probeert te decoderen in uw bestemmingscodering.

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(Message);
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes);
string msg = iso.GetString(isoBytes);

Antwoord 2, autoriteit 15%

Ik denk dat je probleem is dat je aanneemt dat de bytes die de utf8-tekenreeks vertegenwoordigen, resulteren in dezelfde tekenreeks als ze als iets anders worden geïnterpreteerd (iso-8859-1). En dat is gewoon niet het geval. Ik raad je aan om dit uitstekende artikelvan Joel spolsky te lezen.


Antwoord 3, autoriteit 9%

Probeer dit:

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(Message);
byte[] isoBytes = Encoding.Convert(utf8,iso,utfBytes);
string msg = iso.GetString(isoBytes);

Antwoord 4, autoriteit 5%

Je moet eerst de bron van de string herstellen.

Een tekenreeks in .NET is eigenlijk gewoon een array van 16-bits Unicode-codepunten, tekens, dus een tekenreeks is niet in een bepaalde codering.

Het is wanneer je die string neemt en deze converteert naar een set bytes dat codering in het spel komt.

In ieder geval, de manier waarop je het deed, een string gecodeerd naar een byte-array met de ene tekenset en deze vervolgens gedecodeerd met een andere, zal niet werken, zoals je ziet.

Kun je ons meer vertellen over waar die originele string vandaan komt en waarom je denkt dat deze verkeerd is gecodeerd?


Antwoord 5, autoriteit 4%

Het lijkt een beetje vreemde code. Om een ​​string uit de Utf8-bytestream te halen, hoeft u alleen maar:

string str = Encoding.UTF8.GetString(utf8ByteArray);

Als je de iso-8859-1 byte-stream ergens moet opslaan, gebruik dan gewoon:
extra regel code voor vorige:

byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);

Antwoord 6

Ik heb net de Nathan-oplossing gebruikt en het werkt prima. Ik moest ISO-8859-1 naar Unicode converteren:

string isocontent = Encoding.GetEncoding("ISO-8859-1").GetString(fileContent, 0, fileContent.Length);
byte[] isobytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(isocontent);
byte[] ubytes = Encoding.Convert(Encoding.GetEncoding("ISO-8859-1"), Encoding.Unicode, isobytes);
return Encoding.Unicode.GetString(ubytes, 0, ubytes.Length);

Antwoord 7

Encoding targetEncoding = Encoding.GetEncoding(1252);
// Encode a string into an array of bytes.
Byte[] encodedBytes = targetEncoding.GetBytes(utfString);
// Show the encoded byte values.
Console.WriteLine("Encoded bytes: " + BitConverter.ToString(encodedBytes));
// Decode the byte array back to a string.
String decodedString = Encoding.Default.GetString(encodedBytes);

Antwoord 8

Misschien kan het helpen
Converteer de ene codetabel naar de andere:

   public static string fnStringConverterCodepage(string sText, string sCodepageIn = "ISO-8859-8", string sCodepageOut="ISO-8859-8")
    {
        string sResultado = string.Empty;
        try
        {
            byte[] tempBytes;
            tempBytes = System.Text.Encoding.GetEncoding(sCodepageIn).GetBytes(sText);
            sResultado = System.Text.Encoding.GetEncoding(sCodepageOut).GetString(tempBytes);
        }
        catch (Exception)
        {
            sResultado = "";
        }
        return sResultado;
    }

Gebruik:

string sMsg = "ERRO: Não foi possivel acessar o servico de Autenticação";
var sOut = fnStringConverterCodepage(sMsg ,"ISO-8859-1","UTF-8"));

Uitvoer:

"Não foi possivel acessar o servico de Autenticação"

Antwoord 9

Hier is een voorbeeld voor ISO-8859-9;

protected void btnKaydet_Click(object sender, EventArgs e)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet";
    Response.AddHeader("Content-Disposition", "attachment; filename=XXXX.doc");
    Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-9");
    Response.Charset = "ISO-8859-9";
    EnableViewState = false;
    StringWriter writer = new StringWriter();
    HtmlTextWriter html = new HtmlTextWriter(writer);
    form1.RenderControl(html);
    byte[] bytesInStream = Encoding.GetEncoding("iso-8859-9").GetBytes(writer.ToString());
    MemoryStream memoryStream = new MemoryStream(bytesInStream);
    string msgBody = "";
    string Email = "[email protected]";
    SmtpClient client = new SmtpClient("mail.xxxxx.org");
    MailMessage message = new MailMessage(Email, "[email protected]", "ONLINE APP FORM WITH WORD DOC", msgBody);
    Attachment att = new Attachment(memoryStream, "XXXX.doc", "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet");
    message.Attachments.Add(att);
    message.BodyEncoding = System.Text.Encoding.UTF8;
    message.IsBodyHtml = true;
    client.Send(message);}

Other episodes