C#中检测字节数组编码

9
有没有办法在C#中确定字节数组的编码方式?
我有一个字符串,比如"Lorem ipsum áéíóú ñÑç",我用几种编码方式获取字节数组。
我想要一个识别字节数组编码的方法,以便重新获取字符串值。
另一个问题是,也许我会在数据库中有一个存储BLOB(如字节数组)的列。一个字符串之前被转换为UTF-8字节数组。或许另一个应用程序使用Unicode编码将字符串转换为字节数组。
在数据库列中有多种编码的字节数组,找到字节数组的编码方式非常有用。我需要一种方法来确定字节数组的编码方式。
测试:
string DataXmlForSupport = "<support><machinename></machinename><comments>Este es el log 1 áéíóú</comments></support>";
        string DataXmlForSupport2 = "Lorem ipsum áéíóú ñÑç";

        [TestMethod]
        public void Encoding_byte_array_string()
        {
            var uencoding = new System.Text.UnicodeEncoding();
            byte[] data = uencoding.GetBytes(DataXmlForSupport);

            var dataXml = Encoding.Unicode.GetString(data);
            Assert.AreEqual(DataXmlForSupport, dataXml, "Se esperaba resultados Unicode");

            dataXml = Encoding.UTF8.GetString(data);
            Assert.AreNotEqual(DataXmlForSupport, dataXml, "NO Se esperaba resultados UTF8");

            var utf8 = new System.Text.UTF8Encoding();
            data = utf8.GetBytes(DataXmlForSupport2);

            dataXml = Encoding.UTF8.GetString(data);
            Assert.AreEqual(DataXmlForSupport2, dataXml, "Se esperaba resultados UTF8");

            dataXml = Encoding.Unicode.GetString(data);
            Assert.AreNotEqual(DataXmlForSupport2, dataXml, "NO Se esperaba resultados Unicode");

        }

你应该修复你的数据库,只保留一种编码方式,或者将编码名称存储在单独的列中。无法可靠地检测编码方式。 - SLaks
通常情况下,将编码与数据关联起来是您的工作。例如,在大多数XML / HTML文件中,您将看到描述编码的属性之一。如果未提供编码,则根据规范通常会假定默认编码。 - Trevor Elliott
可能是重复的问题:如何检测文本文件的字符编码? - Jim Dagg
@JimDagg 文本文件和字符串不完全相同,我认为它们之间有一些差异。无论如何,也许我们可以分享一下彼此的知识。 - Kiquenet
3个回答

4
简而言之,不行。请参考如何检测文本文件的字符编码?,了解各种编码以及为什么不能自动确定的详细答案。
您最好的解决方案是将字符串从其原始编码转换为UTF8,并将其转换为字节数组。然后,您将知道字节数组的编码...

如果我将字符串转换为UTF8编码,那么字节数组的编码就是UTF8。不管怎样,最安全的将字符串转换为UTF8的方法是什么? - Kiquenet

3

我意识到我来晚了,但我最近需要完成这个任务,并找到了一个好的方法:

byte[] data; // Populate this however you see fit with your data
string text;
Encoding enc;
using (StreamReader reader = new StreamReader(new MemoryStream(data), 
                                              detectEncodingFromByteOrderMarks: true))
{
    text = reader.ReadToEnd();
    enc = reader.CurrentEncoding; // the reader detects the encoding for you!
}

1
只有当数据以BOM开头时,此方法才有效,但并非总是如此。否则,它基本上会默认为UTF-8。 - Demonslay335

-1

补充其他回答,您可以尝试执行以下操作:

string str = BitConverter.ToString(byte_array);
byte[] byte_array = Encoding.UTF8.GetBytes(str);

2
这样做不起作用,因为´BitConverter.ToString(byte_array)´会将数组转换为带有十六进制值的字符串。 - Jesper Lundin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接