linux下 vi中[noeol]以及出现 feff 的问题

"uptime.py" [noeol] 69L, 2311C
"system/uptime.py" 69L, 2312C

‘noeol‘ 就是 ‘no end-of-line‘, 即“没有行末结束符”

使用cat -A 命令可以看到两个文件的不同之处在于最后一行是否有换行符

cat -A uptime.py
if __name__ == ‘__main__‘:$
    uptime = uptime()$
    print(uptime)$
[email protected]:~/hanhuakai/pro_07/git_0709/ssapi#

cat -A system/uptime.py
if __name__ == ‘__main__‘:$
    uptime = uptime()$
    print(uptime)[email protected]:~/hanhuakai/pro_07/git_0709/ssapi#

linux下feff的问题

由于linux下vi无法直接写入中文注释,所以只能在windows下将写好注释的代码传到linux服务器上,但是问题也就出现了,我在 windows下用的是Notepad++这款编辑器(感觉还挺不错,有语法高亮识别)编辑源代码的,加过注释后上传到linux上无论什么语言环境 (LANG)都是乱码,然后看了一下Notepad++的设置,发现默认为ANSI格式,于是就转换为UTF-8格式编码(因为linux里有这个格式的 嘛),然后再上传到linux服务器上,linux也设为UTF-8语言环境,可以看到中文注释了!但是发现每个文件第一行都会有 “<feff>”这个字符串。google了下发现问题的所在了。

原来这是个被称作BOM(Byte Order Mark)的不可见字符,是Unicode用来标识内部编码的排列方式的,在UTF-16、UTF-32编码里它是必需的,而在UTF-8里是可选的。因 此,才会出现有的编辑器在文件头部添加添加BOM、而有的语法解析器又不作处理的的混乱情况。所谓 BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序 (Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space。

这个BOM可以在编辑文本时设置的,但是,只能在第一次编辑时才能设置它为bomb还是nobomb,编辑完并保存后就无法再更改编码格式了。有关bomb命令:

#设置UTF-8编码
:set fileencoding=utf-8
#添加BOM
:set bomb
#删除BOM
:set nobomb
#查询BOM
:set bomb?

如下例子:

用vi编辑一个测试文本test.txt

[plain] view plaincopy

  1. test bomb or nobomb
  2. ~
  3. ~
  4. ~
  5. ~
  6. ~
  7. ~
  8. ~
  9. ~
  10. ~

查询BOM结果:(set bomb ?)

[plain] view plaincopy

  1. ~
  2. ~
  3. ~
  4. ~
  5. ~
  6. nobomb

更改BOM结果:(set bomb)

[plain] view plaincopy

  1. ~
  2. ~
  3. ~
  4. ~
  5. ~
  6. ~
  7. bomb

保存后再次打开就会发现如下图所示:

而且我们对于上传过来的源代码没法做修改,网上有人说可以删除BOM(grep -I -r -l $‘\xEF\xBB\xBF‘ * |
xargs sed -i ‘s/^\xEF\xBB\xBF//;‘),我试过了不行,不知哪位大牛指点下?检查文件中是否含BOM的命令为:

[plain] view plaincopy

  1. grep -I -r -l $‘\xEF\xBB\xBF‘ *

这个命令是有效的。

既然没法靠在linux下有什么命令删除BOM,那咱们只能从源头处理了,编码更改为无BOM的UTF-8编码格式。Notepad++有转换此格式的选项:

转换过后保存下然后再传到linux服务器上,问题就解决了!!

另:这个问题在sun环境和Hp环境下没有此问题,我不清楚如果忽略这个问题在编译时或程序运行时是否会产生异常,网上有人反映是有的,所以还是建议麻烦些也不要忽略此问题,谁晓得它会惹出什么麻烦呢

-- 转自  http://blog.csdn.net/lyn_bigdream/article/details/8746241

linux下 vi中[noeol]以及出现 feff 的问题

时间: 2024-10-02 14:55:27

linux下 vi中[noeol]以及出现 feff 的问题的相关文章

Linux下vi替换字符命令操作实例

在Linux下的开发中,经常涉及到对文件里的字符进行处理,当中,对字符的替换操作也是非常的频繁. 本文以一个实际的文件为例,具体介绍了Linux下经常使用的vi替换字符命令,为相关的开发工作提供给了參考. 本文中被操作的文件为TestFile.txt,当中的内容例如以下: [email protected]:~/zhouzx/Test> cat TestFile.txt 12345678907890 ABCDABCDEFGHIJ 12345^&*()() 98765432103210 abc

Linux下vi编辑器粘贴复制剪切功能

RedHat 9.0 Linux下vi编辑器实现简单的粘贴复制剪切功能": 如果想把文件内的第三行内容黏贴到第十五行: 1.进入你的文件,(处于命令模式,而不是编辑模式) 2.将你的光标移到你的第三行的开头(用方向键) 3,按下v,(你发现切换到可视模式了),按方向键,知道选中你想要的内容 4.按y,再将光标移到第十四行末尾. 5.按p.完成 此方法可以用于多行的粘贴->复制 若想剪切->复制的话就更简单了(只能用于单行) 1.进入你的文件,(处于命令模式,而不是编辑模式) 2.将你

Linux下Vi/Vim使用笔记

Linux下Vi/Vim使用笔记 启动和关闭vim vi 打开 Vi/Vim 打开 Vi/Vim 并加载文件 <file> vi <file> ZQ 无条件退出 :q! 无条件退出 ZZ 存盘并退出 :wq 存盘并退出 vim编辑器的三种模式:一般模式.编辑模式和命令行模式在一般模式中可以进行删除.复制和粘贴的功能,但是无法编辑文件内容. 从一般模式切换到编辑模式可以按下i.I.o.O.a.A.r.R键. 注意区分当前是INSERT还是REPLACE模式! i: 插入,从目前光标所

Linux下VI命令详细介绍

vi 是"Visual Interface" 的简称,它在Linux 上的地位就仿佛Edit 程序在DOS上一样.它可以执行输出.删除.查找.替换.块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的. vi 不是一个排版程序,它不象Word 或WPS 那样可以对字体.格式.段落等其他属性进行编排,它只是一个文本编辑程序. vi 没有菜单,只有命令,且命令繁多.限于篇幅,本文只介绍常用的命令. Vi 有三种基本工作模式:命令行模式,文本输入模式和末行模

【linux】linux下vi命令的使用

进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后一行首 vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处 vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename vi filename....filename :打开多个文件,依次进行编辑 移动光标类命令h :光标左

dos2unix,去掉Linux下文件中的^M

Windows系统下使用VS2010编写好的CPP文件,想放到Linux上进行编译.发现Linux上文件中的每行代码末尾都跟着^M这个符号. 为什么同一份文件在windows上和Linux上显示的不一样呢?原来是由于DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致造成的. 对于回车符的定义:windows:0D0Aunixlinux: 0AMAC: 0D Linux下专门有两个工具可以互换Windows格式和Linux格式,分别是dos2unix和unix2dos 那么,如何去除L

linux下php中找不到php配置文件php.ini的解决方法

自己编译安装的php经常会遇上这种问题,找不到php.ini.可以按照如下方法解决: 首先需要说明的是,如果你的php是编译安装的,那么默认是没有php.ini的,你必须自行去源码包里边拷贝.运行phpinfo()命令可以看到php指定的配置文件路径,把配置文件放到这个路径中即可. linux下php中找不到php配置文件php.ini的解决方法

Linux下shell中case命令详解(常规的break、无条件继续和有条件继续)

linux下shell中的case名字和C/C++中的switch类似,但是shell中的case更强大和复杂. 1.强大主要体现在:shell中case中的关键字可以是字符串类型,而每一项中可以包含正则表达式. 2.复杂主要体现在:shell中case的每一个项后有三个选择:break(常规的break).unconditional follow up(无条件继续)和conditional follow up(有条件继续). 这篇文章的重点是上面的第2点. case的无条件继续和有条件继续是b

Linux下QT中执行shell命令

当需要在QT中执行shell命令时可以利用以下方法: (1)首先包含头文件: #include <QProcess> (2)执行shell命令: QProcess::execute("ls"); ///////////////////// #include  <QProcess> void Widget:on_pushButton_clicked() { //* system("ls");//调用LINUX C函数库中的system(cons