我有很多字节数组;每个都是一个字符串。我如何找到每个使用的编码?

问题描述 投票:-1回答:2

我有一个从数据库中读取二进制数据的应用程序。检索的每个字节数组表示一个字符串但是,字符串都来自不同的编码(最常见的是ASCII,UTF-8 BOM和UTF-16 LE,但还有其他编码)。在我自己的应用程序中,我正在尝试将字节数组转换回字符串,但用于从字符串到字节的编码不会与字节一起存储。在C#中是否可以确定或推断字节数组中使用的编码?

用例简化如下。假设字节数组总是一个字符串。还假设字符串可以使用任何编码。

byte[] bytes = Convert.FromBase64(stringAsBytesAsBase64);
string originalString = Encoding.???.GetString(bytes);
c# .net character-encoding
2个回答
0
投票

对于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作为具有已知编码的文本返回,则可以使用您需要的任何编码对其进行序列化。


-1
投票

有人贬低了这一点。也许是因为它没有明确答案:

在C#中是否可以确定或推断字节数组中使用的编码?

没有。

下面是你能做的最好的,你会明白为什么它有问题:

您可以从已知的Encodings.GetEncodings()列表开始,并消除可能性。最后,您将拥有许多已知的可能性,许多已知的不可能性和可能未知的可能性(对于.NET中不支持的编码,如果有的话)。这一切都是事实。

然后,您可以应用启发式或预期内容的一些知识来进一步缩小列表范围。如果应用每个剩余编码的结果都是相同的,那么即使您没有识别原始编码,您也很可能得到了正确的文本。

© www.soinside.com 2019 - 2024. All rights reserved.