如何编码和解码破碎的中文/ Unicode字符?

时间:2012-06-10 09:59:53

标签: c# model-view-controller unicode

我尝试使用Google搜索,但无法找到以下文字所属的字符集:

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

但是放<meta http-equiv="Content-Type" Content="text/html; charset=utf-8">并将该字符串保存为HTML文件,我能够正确查看中文字符:

具有静电产生装置之影像输入装置

所以我的问题是:

  1. 我可以使用哪些工具来检测此文本的字符集?

  2. 如何在C#中正确转换/编码/解码?

  3. 更新: 为了完成,我已经更新了这个测试。

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

    感谢。

5 个答案:

答案 0 :(得分:7)

将文本文件中的“bad”字符串保存为元标记,声明正确的编码时,发生的情况是文本编辑器使用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。但有时,数据库中的数据存储错误,您必须使用这些游戏来解决问题。

答案 1 :(得分:1)

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 

答案 2 :(得分:0)

我不太确定你的意思,但我猜你要在字节数组形式的特定编码中的字符串和字符串之间进行转换。我们假设字符编码称为“FooBar”:

这是你编码和解码的方式:

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

您可以在MSDN了解有关编码类的更多信息。

答案 3 :(得分:0)

在帖子结束时回答你的问题:

  1. 如果您想在运行时确定文本编码,请查看:http://code.google.com/p/ude/

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

答案 4 :(得分:0)

这是Windows Latin 1.我将中文文本作为UTF-8粘贴到BBEDIT(Mac的文本编辑器)中,并将文件重新打开为Windows Latin 1和bang,确切的变音符号出现了。