检测字节数组C#的编码

时间:2013-10-22 13:43:51

标签: c# arrays encoding utf-8 detect

有没有办法在C#中确定字节数组的编码?

我有任何字符串,例如“LoremipsumáéíóúñÑç”,我使用多种编码获取字节数组。

我想在字节数组中检测编码的唯一方法,我再次得到字符串值。

其他问题,也许,我会在数据库中有一个存储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");

        }

3 个答案:

答案 0 :(得分:2)

简而言之,没有。请参阅How to detect the character encoding of a text file?以获取有关各种编码的详细答案以及无法自动确定的原因。

您最好的解决方案是将字符串从其原始编码转换为UTF8并将其转换为字节数组。然后你就会知道你的字节数组的编码......

答案 1 :(得分:0)

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


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

答案 2 :(得分:0)

我意识到我在这里参加聚会迟到了,但是我只是需要做这件事,并且找到了一种很好的方法来做到这一点:

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