识别编码解码字节数组为字符串



我有一个函数,它返回一个字节数组,表示我需要解析的JSON字符串。通常,我会使用Encoding.Default.GetString(myByteArray)将其转换为字符串,但生成的字符串中有一些无法识别的字符:?{"rects":[],"text":""}而不是{"rects":[],"text":""}

我尝试过使用Encoding类的所有其他编码方案(我知道的):UTF8,UTF7,UTF32,Unicode,BigEndianUnicode,Latin1ASCII,但每一个都导致了?,??ÿ_开头的字符串(或者在UTF32的情况下,整个字符串是?'s)。

奇怪的是,使用new StreamReader(new MemoryStream(myByteArray)).ReadToEnd()完美地解码了字符串,这就是我目前在代码中使用的。我使用StreamReader.CurrentEncoding来找出它使用的编码并将其打印到控制台(System.Text.UnicodeEncoding),然后尝试使用new UnicodeEncoding().GetString(myByteArray),但仍然没有运气。

我如何识别字节数组使用什么编码,以便我可以直接解码它,而不是在流中包装它?

// data is the example JSON string: {"rects":[],"text":""}
// In practice, the JSON strings are much longer.
var data = new byte[] { 255, 254, 123, 0, 34, 0, 114, 0, 101, 0, 99, 0, 116, 0, 115, 0, 34, 0, 58, 0, 91, 0, 93, 0, 44, 0, 34, 0, 116, 0, 101, 0, 120, 0, 116, 0, 34, 0, 58, 0, 34, 0, 34, 0, 125, 0 };
var ms = new MemoryStream(data);
var sr = new StreamReader(ms);
var text = sr.ReadToEnd();
Console.WriteLine(sr.CurrentEncoding);
Console.WriteLine(text);
var text2 = Encoding.Default.GetString(data);
Console.WriteLine(text2);
dynamic json = JsonConvert.DeserializeObject<dynamic>(text);
Console.WriteLine(json.text);
Console.WriteLine(json.rects);

谢谢!

你有UTF-16和BO 请给ark (BOM),它定义了编码。在您的示例中,BOM是FE,即UTF-16 (LE):

var data = new byte[] { 
255, 254, // <- BOM (UTF-16 (LE))
123, 0, 34, 0, 114, 0, /* Payload */ };

所以你可以去掉BOM并解码其余部分:

string result = Encoding.Unicode.GetString(data.AsSpan(2));

注意,文件读取器(如StreamReader)可以检测BOM,获得正确的解码器,并在读取文件时使用它。

前两个字节是干什么用的?看看255和254是什么字符https://ascii-tables.com/只要把它们去掉就可以了

最新更新