我有一个函数,它返回一个字节数组,表示我需要解析的JSON字符串。通常,我会使用Encoding.Default.GetString(myByteArray)
将其转换为字符串,但生成的字符串中有一些无法识别的字符:?{"rects":[],"text":""}
而不是{"rects":[],"text":""}
。
我尝试过使用Encoding
类的所有其他编码方案(我知道的):UTF8
,UTF7
,UTF32
,Unicode
,BigEndianUnicode
,Latin1
和ASCII
,但每一个都导致了?
,??
或ÿ_
开头的字符串(或者在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/只要把它们去掉就可以了