2013-10-22 69 views
4

有没有什么办法可以确定C#中的字节数组编码?检测字节数组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"); 

     } 
+0

你应该修正你的数据库只有一种编码,或者将编码名称存储在一个单独的列中。无法可靠地检测编码。 – SLaks

+0

通常,将您的编码与数据关联是您的工作。例如,在大多数XML/HTML文件中,您将看到的第一件事情是描述编码的属性。如果没有提供编码,那么根据规范,通常会有一个推测的默认编码。 –

+0

[如何检测文本文件的字符编码?]的可能的重复(http://stackoverflow.com/questions/4520184/how-to-detect-the-character-encoding-of-a-text-file) –

回答

2

总之,没有。请参阅How to detect the character encoding of a text file?以获得关于各种编码的详细答案以及为什么它们不能自动确定。

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

+0

如果我将字符串转换为UTF8编码,则字节数组的编码是UTF8。无论如何,安全地将字符串转换为UTF8的最佳方式是什么? – Kiquenet