gpt4 book ai didi

.net - Encoding.UTF8.GetString 不考虑 Preamble/BOM

转载 作者:行者123 更新时间:2023-12-03 10:41:07 29 4
gpt4 key购买 nike

在 .NET 中,我尝试使用 Encoding.UTF8.GetString方法,它接受一个字节数组并将其转换为 string .

看起来这个方法忽略了 BOM (Byte Order Mark) ,它可能是 UTF8 字符串的合法二进制表示的一部分,并将其作为字符。

我知道我可以使用 TextReader根据需要消化 BOM,但我认为 GetString 方法应该是某种使我们的代码更短的宏。

我错过了什么吗?这是故意的吗?

这是一个复制代码:

static void Main(string[] args)
{
string s1 = "abc";
byte[] abcWithBom;
using (var ms = new MemoryStream())
using (var sw = new StreamWriter(ms, new UTF8Encoding(true)))
{
sw.Write(s1);
sw.Flush();
abcWithBom = ms.ToArray();
Console.WriteLine(FormatArray(abcWithBom)); // ef, bb, bf, 61, 62, 63
}

byte[] abcWithoutBom;
using (var ms = new MemoryStream())
using (var sw = new StreamWriter(ms, new UTF8Encoding(false)))
{
sw.Write(s1);
sw.Flush();
abcWithoutBom = ms.ToArray();
Console.WriteLine(FormatArray(abcWithoutBom)); // 61, 62, 63
}

var restore1 = Encoding.UTF8.GetString(abcWithoutBom);
Console.WriteLine(restore1.Length); // 3
Console.WriteLine(restore1); // abc

var restore2 = Encoding.UTF8.GetString(abcWithBom);
Console.WriteLine(restore2.Length); // 4 (!)
Console.WriteLine(restore2); // ?abc
}

private static string FormatArray(byte[] bytes1)
{
return string.Join(", ", from b in bytes1 select b.ToString("x"));
}

最佳答案

It looks like this method ignores the BOM (Byte Order Mark), which might be a part of a legitimate binary representation of a UTF8 string, and takes it as a character.



它看起来根本没有“忽略”它 - 它忠实地将其转换为 BOM 字符。毕竟就是这样。

如果你想让你的代码忽略它转换的任何字符串中的 BOM,这取决于你做...或使用 StreamReader .

请注意,如果您使用 Encoding.GetBytes其次是 Encoding.GetString或使用 StreamWriter其次是 StreamReader ,这两种形式要么产生然后吞下要么不产生 BOM。只有当您使用 StreamWriter 进行混合时(使用 Encoding.GetPreamble )与直接 Encoding.GetString调用您最终得到“额外”字符。

关于.net - Encoding.UTF8.GetString 不考虑 Preamble/BOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11701341/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com