小谈Vim打开文件开头的<feff>
在本地Windows机上开发的PHP程序上传到linuxserver上后,通过浏览器訪问对应接口。发现返回的数据前多了一个莫名的字符‘-’,甚为不解。之后通过网络抓包的方式,查看到接口返回数据前多了 EF BB BF。
出现了如此令人不知所以然的bug总是极度让人抓狂。经过了几番尝试之后,仍然不能得以解决,但也隐隐感认为可能是字符编码的问题,遂用PHPStorm新建了一个文件,然后又一次将之前出bug的文件内容重写了一遍(庆幸文件不是太大,用svn的话,应将文件回滚到之前没有bug的版本号),然后又一次上传。问题竟然攻克了。
喜悦中就此作罢,并没有深究当中的缘由。
原本以为bug就此解除,结果之后又碰到了一次,实在不能忍。这次查看代码并非採用在本机上改然后又一次上传server的方式,而是直接在server上用vim打开逐行查看。结果惊喜出现了。vim的文件头显示多了‘<feff>’字符。直觉告诉自己这就是罪魁祸首。于是进一步探究了<feff>字符。
这里首先说一下utf8、utf16、utf32编码。由于这样的编码相应多个字节,所以一般utf16和utf32会用BOM(Byte Order Mark,为不可见字符)标识内部编码的字节序(Big/Litttle Endian),而utf8加不加BOM都能够。一般我们用的编辑器utf8编码是没有加BOM标识的,可是windows下的记事本却会将utf8编码的文件前加上BOM标识。
而这个BOM标识即相应着linux环境下vim打开后出现的<feff>字符。
<feff>字符会出如今<?php
...?>的前面。PHP对这种文件进行解析时。会将这个字符输出,从而导致了上述的bug。
PS:还是少用记事本打开或编辑utf8编码的代码,血的教训啊。。!
小谈Vim打开文件开头的<feff>的更多相关文章
- Windows下Git Bash中VIM打开文件中文乱码
Windows下Git Bash中VIM打开文件中文乱码,解决方法是: 步骤一 admin@DESKTOP-O99620V MINGW64 /d/项目GGE/Hard_for_GGE (master) ...
- vim打开文件时显示行号
vim打开文件是,默认不提示行号. 至于显示行号的用途,因人而异 linux下一个主机可能有N个账户.对于配置分为两种:仅配置当前账户,配置所有账户 vim配置文件路径(Centos 5.5 fin ...
- Ubuntu下vim打开文件时,提示请按ENTER或其它命令继续
最近配置了一下vim,重启后,配置生效.但在用vim打开文件的时候,出现了一个问题:每次用vim打开文件的时候,都会提示请按ENTER或其它命令继续.这个真的很烦人.那么怎么把它消除掉呢? 首先要搞清 ...
- Vim 打开文件同时定位到某一行
在linux下,当后台某一行报警出错后,想用vim打开文件同时定位到某一行, Vim +某一行 filename 即可.
- 使用vim打开文件的16进制形式,编辑和全文替换
1.先用vim打开文件的二进制形式,如果不以二进制可能会产生转换错误. vim -b file-to-open.dat 2.用xxd把文件转换成十六进制格式 :%!xxd 现在就可以对待普通文本一样查 ...
- Xshell 远程使用vim打开文件不能使用右键复制粘贴(右键显示可视)的问题
Xshell 远程使用vim打开文件不能使用右键复制粘贴(右键显示可视)的问题 Debian9.4系统不能再VIM打开文件界面不能使用右键复制粘贴 root@debian:~# vim /usr/sh ...
- vi/vim打开文件提示Found a swap file by the name
问题分析 有一次在远程连接主机时,用vi打开文件my.ini却提示:Found a swap file by the name ".my.ini.swp".百度了下才知道,原来在使 ...
- VIM打开文件与保存文件
打开文件 VIM /etc/inittab 默认的安装没有设置ctrl_W为退出.也可以设置::map <C-W> :close<CR> 或:map <C-W> : ...
- Vim打开文件中文乱码如何解决?
今天想找一下之前的随机数组demo复习,在源文件src里用vim打开.java文件,中文出现乱码 vim也是,选项里没有直接选择设置utf-8之类的 查了下网上,http://easwy.com/bl ...
随机推荐
- day01_13.数组
数组基本语法 <?php $a = array(键1=>值1,键2=>值2); ?> <?php $arr = array(1=>'张三的裤子',2=>'李四 ...
- Eclipse调试程序及项目的导入导出
Eclipse调试程序 调试概述: ① 调试就是测试程序的方法,主要的目的就是解决程序的逻辑问题,流程是:发现问题.修改问题.正确执行; ② 以前我们可以使用System.out.printl ...
- PHP7异常处理
try { // Code that may throw an Exception or Error. }catch (Exception $e) { } catch (Error $t) { } p ...
- 【Luogu】P2473奖励关(期望DP)
题目链接 逆推期望DP.设f[i][j]为1~i-1中吃到的宝物集合为j,在i~k轮能得到的最大期望分数. 如果不吃显然f[i][j]+=f[i+1][j]/n 如果吃就是f[i][j]+=max(f ...
- NOJ——1274The battle of Red Cliff(并查集按秩合并)
[1274] The battle of Red Cliff 时间限制: 1000 ms 内存限制: 65535 K 问题描述 Zero loves palying Sanguo game very ...
- BZOJ1856 [SCOI2010]生成字符串 【组合数】
题目 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求 ...
- Thrift & RPC介绍
在学习thrift之前,先来看一下什么是rpc rpc远程过程调用,通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC采用客户机/服务器模式.请求程序就是一个客户机,而服务提供 ...
- [LeetCode] Text Justification words显示的排序控制
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...
- linux 时间模块 二
Linux中有硬件时钟与系统时钟 在Linux中有硬件时钟与系统时钟等两种时钟.硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟.系统时钟则是指kernel中的时钟.当Linux启 ...