6

我试过用谷歌搜索,但找不到下面这段文字所属的字符集:

具有éœé›»ç”¢ç”Ÿè£ç½®ä¹‹å½±åƒè¼¸å…¥è£ç½®

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

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

所以我的问题是:

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

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

更新:为了完整起见,我更新了这个测试。

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

        byte[] postBytes = window1252.GetBytes(encodedText);
        
        string decodedText = utf8.GetString(postBytes);
        string actualText = "具有靜電產生裝置之影像輸入裝置&quot;;
        Assert.AreEqual(actualText, decodedText);
    }
}
4

5 回答 5

9

当您将“坏”字符串保存在带有声明正确编码的元标记的文本文件中时,会发生什么情况是您的文本编辑器正在使用 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。但是,有时,数据库中的数据一开始就存储不正确,您必须求助于这些游戏来解决问题。

于 2012-06-10T17:12:10.697 回答
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 
于 2015-12-10T11:17:43.690 回答
0

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

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

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

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

于 2012-06-10T10:21:47.907 回答
0

在帖子末尾回答您的问题:

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

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

于 2012-06-10T10:29:07.033 回答
0

它是 Windows Latin 1。我将中文文本作为 UTF-8 粘贴到 BBEDIT(Mac 的文本编辑器)中,然后以 Windows Latin 1 重新打开文件,然后砰的一声,出现了确切的变音符号。

于 2012-06-10T15:49:14.683 回答