unity读取csv因为BOM文件头导致的坑

最近做csv读取的时候遇到一个特别坑的事情,就是两个csv文件用txt打开以及比对工具比对都是一模一样,但是一个却解析不到,一个却能解析到。如下图,这是比对截图。

如上图,左边文件通过Get("1001")是取不到数据的,而右边的文件却可以。而且从肉眼看都是完全没有问题的。

再仔细来看看其他信息:

●通过unity读取TextAsset的byte[],发现只有146个byte

●通过FileStream读取byte[],发现有149个byte,但是肉眼看到无法区分,因为多出来的3个byte是BOM文件头,用于标记文件的Encoding格式。

●直接通过File.ReadAllText接口读取,发现数据过滤掉了Bom文件头

●通过字符串比对,输出结果发现,File.ReadAllText接口和Unity的TextAsset数据一致。

结论:

如果需要处理csv文件,直接通过File.ReadAllText接口,读取到的数据会自动过滤掉文件头,处理的时候就不会报错了。

Tips:如何知道文件有没有Bom文件头,使用Beyond Compare的时候,注意看左边文件标记有BOM文件头

如果要读取去除BOM文件头的数据,可以使用如下方法:

public static string GetUTF8String(byte[] buffer)
	{
		if (buffer == null)
			return null;

		if (buffer.Length <= 3)
		{
			return Encoding.UTF8.GetString(buffer);
		}

		byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf };

		if (buffer[0] == bomBuffer[0]
			&& buffer[1] == bomBuffer[1]
			&& buffer[2] == bomBuffer[2])
		{
			return new UTF8Encoding(false).GetString(buffer, 3, buffer.Length - 3);
		}

		return Encoding.UTF8.GetString(buffer);
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼蛋-Felix

如果对你有用,可以请我喝杯可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值