一聚教程网:一个值得你收藏的教程网站

热门教程

linux下查找包含utf8 BOM头的文件,并删除BOM头信息(FEEF)

时间:2022-11-14 22:07:44 编辑:袖梨 来源:一聚教程网

UTF-8 编码的文件可以分为no BOM 和 BOM两种格式。

有bom头的存储或者字节流,它一定是unicode字符集编码。到底属于那一种(utf-8还是utf-16或是utf-32),通过头可以判断出来。
在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码
UTF-8的BOM是 EFBBBF,因为UE载入UTF-8文件会转成Utf16,上述的EFBBBF 在Utf16中是FFFE(Unicode-LE的BOM)

1、editplus去BOM头的方法

编辑器调整为UTF8编码格式后,保存的文件前面会多出一串隐藏的字符(也即是BOM),用于编辑器识别这个文件是否是以UTF8编码。

运行Editplus,点击工具,选择首选项,选中文件,UTF-8标识选择 总是删除签名,

然后对PHP文件编辑和保存后的PHP文件就是不带BOM的了。

2、ultraedit去除bom头办法

打开文件后,另存为选项的编码格式里选择(utf-8 无bom头),确定就ok了

今天收到用户反馈,用户在举报谈谈的谈主时会显示提交失败。
这个反馈页面入口在反馈平台,调用谈谈项目的后端接口。 这个服务相关的接口都好久没有动了,为什么会失败呢?
在线上找了一台机器进行debug,发现接口返回内容是“正常”的,一段可读的json字符串。把字符串拷贝下,在js下发现是可以解析的。
但是该项目下用的json_decode,却怎么都decode不成功。调试了半天都觉得甚是古怪,一直都找不到头绪,怕自己脑子是思维定势了,跑去看了会golang,再回来继续解决。
再怎么看, 都还是觉得很正常,不应该出问题。

再一次拷贝接口返回的字符串的时候,发现头部多了个标签。

feff-utf8_bom_remove_linux_vim

feff-utf8_bom_remove_linux_vim
feff-utf8_bom_remove_linux_vim
查了下,发现这个FEFF就是BOM。 参考:字节顺序标记

找到问题所在了,解决问题就好说了。
windows下有各式各样的编辑器,都可以解决bom头问题,可是linux下该怎么解决呢?
google了下,问题都解决了。
1.找到哪些文件包含BOM头。

Example
grep -rl $'\xEF\xBB\xBF' .
通过hexdump可以看到bom头的存在。

hexdump-BOM-utf8-file

2.删除BOM头信息。

Example


sed '1s/^\xEF\xBB\xBF//' filename.php -i

删除后就不会再看到BOM头拉。

hexdump-NO-BOM-utf8-file

可以用一条命令查找并删除文件的BOM头信息:

Example


find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

如果你是在windows中我们可以参考下面方法来解决

windows bom头解决办法

代码如下 复制代码
///
/// 清除UTF8文件的BOM头
///

///
/// 是否成功
private static bool ClearBOM( string filePath )
{
if( !CheckBOM( filePath ) )
return true;

string fileTemp = filePath + ".temp";

using( FileStream fsRead = new FileStream( filePath, FileMode.Open ) )
{
// 跳过前三个字节
fsRead.Seek( 3, SeekOrigin.Begin );
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];

using( FileStream fsWrite = new FileStream( fileTemp, FileMode.Append, FileAccess.Write ) )
{
while( fsRead.Read( buffer, 0, bufferSize ) > 0 )
{
fsWrite.Write( buffer, 0, bufferSize );
}
fsWrite.Close();
}
fsRead.Close();
}

// 改名
try
{
File.Delete( filePath );
File.Move( fileTemp, filePath );
}
catch
{
return false;
}
return true;
}

///
/// 检查是否有BOM头。
/// UTF8文件都有一个3字节的头,为“EF BB BF”(称为BOM--Byte Order Mark)
///

///
///
private static bool CheckBOM( string filePath )
{
bool isBOM = false;
using( FileStream fsRead = new FileStream( filePath, FileMode.Open ) )
{
byte[] buffer = new byte[3];
fsRead.Read( buffer, 0, 3 );
if( 0xef == buffer[0] && 0xbb == buffer[1] && 0xbf == buffer[2] )
isBOM = true;
fsRead.Close();
}
return isBOM;
}

总结:

在多人维护的项目下,很可能会有其他人上传一些不合适的文件或代码,需要对一些常规情况进行监控,及时发现、解决,避免影响线上问题。

热门栏目