最近做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);
}