gpt4 book ai didi

c# - 如何在字符串比较中忽略 UTF-8 字节顺序标记?

转载 作者:可可西里 更新时间:2023-11-01 07:44:51 27 4
gpt4 key购买 nike

我在使用 Visual Studio 2010 的 C# 4.0 单元测试中比较字符串时遇到问题。这个相同的测试用例在 Visual Studio 2008(使用 C# 3.5)中正常工作。

这是相关的代码片段:

byte[] rawData = GetData();
string data = Encoding.UTF8.GetString(rawData);

Assert.AreEqual("Constant", data, false, CultureInfo.InvariantCulture);

调试此测试时,肉眼看来 data 字符串包含与文字完全相同的字符串。当我调用 data.ToCharArray() 时,我注意到字符串 data 的第一个字节是值 65279,它是 UTF-8字节顺序标记。我不明白的是为什么 Encoding.UTF8.GetString() 保留这个字节。

如何让 Encoding.UTF8.GetString() 将字节顺序标记放入结果字符串中?

更新:问题是从磁盘读取文件的 GetData() 使用 FileStream.readbytes()< 从文件中读取数据。我通过使用 StreamReader 并使用 Encoding.UTF8.GetBytes() 将字符串转换为字节来更正此问题,这是它一开始就应该做的!感谢所有帮助。

最佳答案

嗯,我假设这是因为原始二进制数据包含 BOM。如果您不想要,您总是可以在解码后自行删除 BOM - 但您应该考虑字节数组是否应该考虑 BOM。

编辑:或者,您可以使用 StreamReader 来执行解码。下面是一个示例,显示使用 Encoding.GetString 将同一字节数组转换为两个字符或通过 StreamReader 将一个字符转换为一个字符:

using System;
using System.IO;
using System.Text;

class Test
{
static void Main()
{
byte[] withBom = { 0xef, 0xbb, 0xbf, 0x41 };
string viaEncoding = Encoding.UTF8.GetString(withBom);
Console.WriteLine(viaEncoding.Length);

string viaStreamReader;
using (StreamReader reader = new StreamReader
(new MemoryStream(withBom), Encoding.UTF8))
{
viaStreamReader = reader.ReadToEnd();
}
Console.WriteLine(viaStreamReader.Length);
}
}

关于c# - 如何在字符串比较中忽略 UTF-8 字节顺序标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915182/

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