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 plain  copy
  1. test bomb or nobomb  
  2. ~  
  3. ~  
  4. ~  
  5. ~  
  6. ~  
  7. ~  
  8. ~  
  9. ~  
  10. ~  

查询BOM结果:(set bomb ?)

[plain]  view plain  copy
  1. ~  
  2. ~  
  3. ~  
  4. ~  
  5. ~  
  6. nobomb  

更改BOM结果:(set bomb)

[plain]  view plain  copy
  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 plain  copy
  1. grep -I -r -l $'\xEF\xBB\xBF' *  

这个命令是有效的。

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


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

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: IPv6 中的 fe80 开头的地址是一种本地连接地址,即 "link-local" 地址。这些地址仅在计算机所连接的本地网络内可用,并不能在互联网上使用。在 IPv6 中,每个接口都会自动生成一个连接本地地址,这样就可以在同一个网络内的计算机之间相互通信。 在 `ipv6 neighbors` 命令下,fe80 开头的地址表示计算机所连接的网络内的其他计算机的连接本地地址。通常,这些地址用于在两台计算机之间传输数据包,而不是通过路由器进行转发。 ### 回答2: IPv6邻居地址是用于局域网通信的链路本地地址。其中,以“fe80”开头的地址是自动配置的IPv6邻居地址。 IPv6邻居发现协议被用于在同一链路上寻找邻居设备并建立通信。为了实现这一目标,每个设备都被要求配置自己的链路本地地址,以便其他设备能够找到并与之通信。 链路本地地址是以“fe80”开头的地址,后跟设备的唯一标识符。这个标识符通常使用设备的MAC地址生成。 以“fe80”开头的地址在链路上具有全局唯一性,因此可以确保设备之间的通信是准确、可靠的。这些地址通常是通过自动配置的方式生成,并且不需要经过DHCP服务器的分配。 通过IPv6邻居发现协议,设备可以动态地获取其他设备的邻居地址,并且在需要通信时可以路由和查询目标设备的地址。 总之,以“fe80”开头的地址是自动配置的IPv6邻居地址,用于设备在局域网上建立通信,并且能够确保通信的准确性和可靠性。 ### 回答3: IPv6邻居下的fe80开头地址是链路本地地址。链路本地地址是自动配置的本地链接地址,用于同一链路上的节点之间进行通信。在IPv6网络中,每个接口都会自动分配一个链路本地地址,以便在同一链路上的设备之间进行通信。 链路本地地址的前缀为fe80::/64,其中fe80表示链路本地地址的唯一前缀标识符。该地址只在链路上有效,不会在整个网络范围内路由。通过链路本地地址,设备可以直接与相邻的设备进行通信,而不需要通过路由器进行转发。这在局域网中非常有用。 链路本地地址采用EUI-64方法自动分配,其中包括设备MAC地址和特定的标识符。这样可以确保每个设备在链路上具有唯一的地址。 链路本地地址适用于许多局域网协议,如IPv6邻居发现、SLAAC(stateless address auto-configuration)和ICMPv6(Internet Control Message Protocol version 6)。在IPv6网络中,链路本地地址的使用与IPv4网络中的私有IP地址类似。 总之,链路本地地址是IPv6邻居下以fe80开头的地址,用于在同一链路上的设备之间进行直接通信。它是自动配置的本地链接地址,只在链路上有效,而不会在整个网络中进行路由。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值