簡體   English   中英

如何編碼和解碼破碎的中文/ Unicode字符?

[英]How to encode and decode Broken Chinese/Unicode characters?

我試過谷歌搜索但無法找到下面這個文本所屬的字符集:

å...·æœ‰éœé>»C”¢C”葉£ç½®ä¹<å½±åƒè¼¸å...¥è£ç½®

但是將<meta http-equiv="Content-Type" Content="text/html; charset=utf-8">並將該字符串保存為HTML文件,我能夠正確地查看中文字符:

具有靜電產生裝置之影像輸入裝置

所以我的問題是:

  1. 我可以使用哪些工具來檢測此文本的字符集?

  2. 如何在C#中正確轉換/編碼/解碼它們?

更新:為了完成,我已經更新了這個測試。

   [TestMethod]
    public void TestMethod1()
    {
        string encodedText = "具有éœé›»ç”¢ç”Ÿè£ç½®ä¹‹å½±åƒè¼¸å…¥è£ç½®";
        Encoding utf8 = new UTF8Encoding();
        Encoding window1252 = Encoding.GetEncoding("Windows-1252");

        byte[] postBytes = window1252.GetBytes(encodedText);

        string decodedText = utf8.GetString(postBytes);
        string actualText = "具有靜電產生裝置之影像輸入裝置";
        Assert.AreEqual(actualText, decodedText);
    }
}

謝謝。

將“壞”字符串保存在帶有元標記的文本文件中,聲明正確編碼時發生的情況是文本編輯器使用Windows-1252編碼保存文件,但瀏覽器正在讀取文件並將其解釋為UTF -8。 由於“壞”字符串使用Windows-1252編碼錯誤地解碼UTF-8字節,因此您通過將文件編碼為Windows-1252並解碼為UTF-8來反轉該過程。

這是一個例子:

using System.Text;
using System.Windows.Forms;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "具有靜電產生裝置之影像輸入裝置"; // Unicode
            Encoding Windows1252 = Encoding.GetEncoding("Windows-1252");
            Encoding Utf8 = Encoding.UTF8;
            byte[] utf8Bytes = Utf8.GetBytes(s); // Unicode -> UTF-8
            string badDecode = Windows1252.GetString(utf8Bytes); // Mis-decode as Latin1
            MessageBox.Show(badDecode,"Mis-decoded");  // Shows your garbage string.
            string goodDecode = Utf8.GetString(utf8Bytes); // Correctly decode as UTF-8
            MessageBox.Show(goodDecode, "Correctly decoded");

            // Recovering from bad decode...
            byte[] originalBytes = Windows1252.GetBytes(badDecode);
            goodDecode = Utf8.GetString(originalBytes);
            MessageBox.Show(goodDecode, "Re-decoded");
        }
    }
}

即使正確解碼,您仍然需要支持顯示字符的字體。 如果您的默認字體不支持中文,您仍可能看不到正確的字符。

正確的做法是弄清楚為什么你的字符串首先被解碼為Windows-1252。 但是,有時,數據庫中的數據存儲錯誤,您必須使用這些游戲來解決問題。

string test = "敭畳灴獩楫n"; //incoming data. must be mesutpiskin 

byte[] bytes = Encoding.Unicode.GetBytes(test);

string s = string.Empty;

for (int i = 0; i < bytes.Length; i++)
{
    s += (char)bytes[i];
}

s = s.Trim((char)0);

MessageBox.Show(s);
//s=mesutpiskin 

我不太確定你的意思,但我猜你要在字節數組形式的某個編碼中的字符串和字符串之間進行轉換。 我們假設字符編碼稱為“FooBar”:

這是你編碼和解碼的方式:

Encoding myEncoding = Encoding.GetEncoding("FooBar");
string myString = "lala";
byte[] myEncodedBytes = myEncoding.GetBytes(myString);
string myDecodedString = myEncoding.GetString(myEncodedBytes);

您可以在MSDN上了解有關Encoding類的更多信息。

在帖子結尾回答你的問題:

  1. 如果要在運行時確定文本編碼,您應該查看: http//code.google.com/p/ude/

  2. 對於轉換字符集,您可以使用http://msdn.microsoft.com/en-us/library/system.text.encoding.convert(v=vs.100).aspx

它是Windows Latin 1.我將中文文本作為UTF-8粘貼到BBEDIT(Mac的文本編輯器)中,並將文件重新打開為Windows Latin 1和bang,出現了確切的變音符號。

暫無
暫無

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

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