我有很多字节数组;每个都是一个字符串。我如何找到每个使用的编码?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我有很多字节数组;每个都是一个字符串。我如何找到每个使用的编码?相关的知识,希望对你有一定的参考价值。
我有一个从数据库中读取二进制数据的应用程序。检索的每个字节数组表示一个字符串但是,字符串都来自不同的编码(最常见的是ASCII,UTF-8 BOM和UTF-16 LE,但还有其他编码)。在我自己的应用程序中,我正在尝试将字节数组转换回字符串,但用于从字符串到字节的编码不会与字节一起存储。在C#中是否可以确定或推断字节数组中使用的编码?
用例简化如下。假设字节数组总是一个字符串。还假设字符串可以使用任何编码。
byte[] bytes = Convert.FromBase64(stringAsBytesAsBase64);
string originalString = Encoding.???.GetString(bytes);
对于XML文本,XML规范给出了要求以及如何确定编码。
在没有外部字符编码信息(例如MIME头)的情况下,以UTF-8或UTF-16以外的编码存储的已解析实体必须以包含编码的文本声明(参见4.3.1文本声明)开头。宣言:
…
在没有外部传输协议(例如HTTP或MIME)提供的信息的情况下,对于实体来说,这是一个致命的错误,包括以不同于声明中指定的编码的形式向XML处理器呈现编码声明,或者一个实体,它既不以字节顺序标记也不以编码声明开头,以使用UTF-8以外的编码。 -https://www.w3.org/TR/xml/#charencoding
似乎存储设计是丢弃任何“由外部传输协议提供的信息”。存储的内容可能符合规范。您可以检查您的数据。
如果数据已完成,只需让您的XML处理完成工作:
byte[] bytes = Convert.FromBase64(stringAsBytesAsBase64);
using (var stream = new MemoryStream(bytes))
{
var doc = XDocument.Load(stream);
}
如果您确实需要将XML作为具有已知编码的文本返回,则可以使用您需要的任何编码对其进行序列化。
有人贬低了这一点。也许是因为它没有明确答案:
在C#中是否可以确定或推断字节数组中使用的编码?
没有。
下面是你能做的最好的,你会明白为什么它有问题:
您可以从已知的Encodings.GetEncodings()
列表开始,并消除可能性。最后,您将拥有许多已知的可能性,许多已知的不可能性和可能未知的可能性(对于.NET中不支持的编码,如果有的话)。这一切都是事实。
然后,您可以应用启发式或预期内容的一些知识来进一步缩小列表范围。如果应用每个剩余编码的结果都是相同的,那么即使您没有识别原始编码,您也很可能得到了正确的文本。
以上是关于我有很多字节数组;每个都是一个字符串。我如何找到每个使用的编码?的主要内容,如果未能解决你的问题,请参考以下文章