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

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就是BOM。 参考:字节顺序标记

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

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

2.删除BOM头信息。

Example

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

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

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

Example

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

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

windows bom头解决办法

 代码如下 复制代码
/// <summary>
/// 清除UTF8文件的BOM头
/// </summary>
/// <param name="filePath"></param>
/// <returns>是否成功</returns>
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;
}
 
/// <summary>
/// 检查是否有BOM头。
/// UTF8文件都有一个3字节的头,为“EF BB BF”(称为BOM--Byte Order Mark)
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
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;
}

总结:

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

时间: 2024-10-03 08:01:35

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

Linux下查找指定时间内修改过的文件

  假如在linux下修改文件后不记得了,我们需要查找指定时间内做过改动的文件,此时我们可以用find命令来查找. find /opt -iname "*" -atime 1 -type f [找出 /opt 下一天前访问过的文件] 选项 OPTIONS 所有的选项都总是返回真值,它们总会被执行,除非放在表达式中执行不到的地方.因此,清楚起见,最好把它们放在表达式的开头部分. -daystart 从当日起始时开始而不是从24小时之前,计算时间(for -amin, -atime, -c

Linux下查找指定时间内修改过的文件 — find命令

假如在linux下修改文件后不记得了,我们需要查找指定时间内做过改动的文件,此时我们可以用find命令来查找. find /opt -iname "*" -atime 1 -type f [找出 /opt 下一天前访问过的文件] 选项 OPTIONS 所有的选项都总是返回真值,它们总会被执行,除非放在表达式中执行不到的地方.因此,清楚起见,最好把它们放在表达式的开头部分.   -daystart 从当日起始时开始而不是从24小时之前,计算时间(for -amin, -atime, -c

linux下查找某个目录下包含某个字符串的文件

有时候要找以前写的一段程序,但是日久健忘,只记得程序片段里包含某个文字. 那么如何在linux下寻找包含某段文字的文件呢? 强大的find命令可以帮你完成不可能的任务. 比如我只记得我的程序里包含唯一的字符串"111cn.net",于是: 查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "111cn.net" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "1

lnav:Linux下一个基于控制台的高级日志文件查看器

服务器日志是一个由服务器创建并经常更新.用于抓取特定服务和应用的所有活动信息的日志文件.当你的应用或者服务出现问题时这个文件就会非常有用.从日志文件中你可以获取所有关于该问题的信息,例如基于警告或者错误信息它什么时候开始表现不正常. LNAV(Log file Navigator)是 Linux 下一个基于控制台的高级日志文件查看器.它和其它文件查看器,例如 cat.more.tail 等,完成相同的任务,但有很多普通文件查看器没有的增强功能(尤其是它自带多种颜色和易于阅读的格式). 它能在解压

lnav:Linux 下一个基于控制台的高级日志文件查看器

服务器日志是一个由服务器创建并经常更新.用于抓取特定服务和应用的所有活动信息的日志文件.当你的应用或者服务出现问题时这个文件就会非常有用.从日志文件中你可以获取所有关于该问题的信息,例如基于警告或者错误信息它什么时候开始表现不正常. LNAV(Log file Navigator)是 Linux 下一个基于控制台的高级日志文件查看器.它和其它文件查看器,例如 cat.more.tail 等,完成相同的任务,但有很多普通文件查看器没有的增强功能(尤其是它自带多种颜色和易于阅读的格式). 它能在解压

将linux下的rm命令改造成移动文件至回收站【转】

转自:http://blog.csdn.net/a3470194/article/details/16863803 [-] 将linux下的rm命令改造成移动文件至回收站 将AIX下的rm命令改造成移动文件至回收站 将linux下的rm命令改造成移动文件至回收站 rm是Linux下文件删除的命令,它是Linux下非常强大却又非常危险的一条命令,特别是rm -rf有时候强大到让你欲哭无泪,当你想清除当前目录下的所有文件和目录时,很简单 #rm -rf ./* 这没什么,但是,但是如果不小心打成这样

Linux 下如何处理包含空格和特殊字符的文件名

我们经常会看到文件名和文件夹名.大多数时候文件/文件夹的名字和内容相关并以数字和字母开头.字母加数字的文件名最常见,应用也很广泛,但总会需要处理一些包含特殊字符的文件名/文件夹名. 注意:我们可能有各种类型的文件,但是为了简单以及方便实现,在本文中我们只用文本文件(.txt)做演示. 最常见的文件名例子: abc.txt avi.txt debian.txt ... 数字文件名例子: 121.txt 3221.txt 674659.txt ... 字母数字文件名例子: eg84235.txt 3

Linux下使用blkid命令查询设备及文件系统信息的方法

在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询.blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型.LABEL.UUID等信息进行查询.要使用这个命令必须安装e2fsprogs软件包. 直接使用blkid可列出当前系统中所以已挂载文件系统的类型.默认情况下 lsblk 会将块设备输出为树状格式:NAME -- 设备的名称MAJ:MIN -- Linux 操作系统中的每个设备都以一个文件表示,对块(磁盘)设备来说,这里用主次设备编号来描述设备.RM -

Linux下查找后门程序 CentOS 查后门程序的shell脚本_linux shell

每个进程都会有一个PID,而每一个PID都会在/proc目录下有一个相应的目录,这是linux(当前内核2.6)系统的实现. 一般后门程序,在ps等进程查看工具里找不到,因为这些常用工具甚至系统库在系统被入侵之后基本上已经被动过手脚(网上流传着大量的rootkit.假如是内核级的木马,那么该方法就无效了). 因为修改系统内核相对复杂(假如内核被修改过,或者是内核级的木马,就更难发现了),所以在/proc下,基本上还都可以找到木马的痕迹. 思路: 在/proc中存在的进程ID,在 ps 中查看不到