簡體   English   中英

C# 將字符串從 UTF-8 轉換為 ISO-8859-1 (Latin1) H

[英]C# Convert string from UTF-8 to ISO-8859-1 (Latin1) H

我在這個話題上用谷歌搜索過,我看過每個答案,但我仍然不明白。

基本上,我需要將 UTF-8 字符串轉換為 ISO-8859-1,並使用以下代碼執行此操作:

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

我的源字符串是

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

但不幸的是我的結果字符串變成

msg = "�ä�ö�õ�ü

我在這里做錯了什么?

在嘗試將其解碼為目標編碼之前,使用Encoding.Convert調整字節數組。

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

我認為您的問題是您假設表示 utf8 字符串的字節在解釋為其他內容時會產生相同的字符串(iso-8859-1)。 而事實並非如此。 我建議您閱讀 Joel spolsky 撰寫的這篇優秀文章

試試這個:

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

您首先需要修復字符串的來源。

.NET 中的字符串實際上只是一個由 16 位 unicode 代碼點、字符組成的數組,因此字符串沒有任何特定的編碼。

當您獲取該字符串並將其轉換為一組字節時,編碼就起作用了。

在任何情況下,如您所見,您使用一種字符集將字符串編碼為字節數組,然后使用另一種字符集對其進行解碼的方式將不起作用。

你能告訴我們更多關於原始字符串的來源,以及你認為它編碼錯誤的原因嗎?

看起來有點奇怪的代碼。 要從 Utf8 字節流中獲取字符串,您需要做的就是:

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

如果您需要將 iso-8859-1 字節流保存到某處,那么只需使用:前一行的附加代碼行:

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

剛剛使用了 Nathan 的解決方案,效果很好。 我需要將 ISO-8859-1 轉換為 Unicode:

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

也許它可以幫助
將一個代碼頁轉換為另一個:

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

用法:

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

輸出:

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

這是 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 = "mail@xxxxxx.org";
    SmtpClient client = new SmtpClient("mail.xxxxx.org");
    MailMessage message = new MailMessage(Email, "mail@someone.com", "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);}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM