注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

篝火旁的匠人

篝火旁的匠人,开始了思考……

 
 
 

日志

 
 

windows 与unix文本文件的不同  

2009-07-30 11:55:52|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    昨天在做一个小项目的时候,由于在Debian下,用vim输入中文有很大的问题(现在还没有解决,待解决中),为了方便,我先在Debian下写好*.py,然后copy到windows,输好中文后,保存为utf-8编码,最后sput到Debian。接下来就出问题了。没办法,tail -f ~/local/apache/log/error_log,错误提示是:Exec format error: exec of '*.py' failed'。觉得很诧异,因为之前运行都很成功,就是加了几个中文,就算是乱码,也不该报错!几经检查,出现这种错误,很有可能是Debian不能找到程序执行这个脚本,也就是在语句'#!/usr/bin/env python'上出错了。

      在仔华帮助下,od -c *.py,发现在起始部分多了几个字节'\357\273\277',现在才明白处错误的原因。可是为什么会多出几个字节呢?细细研究,才发现windows文本文件和unix的另一个不同(以前我们都知道windows和unix文本文件的不同在于换行,windows是'\r\n',unix是'\n')。这个不同应该从字符编码说起!

    在windows系统中,Unicode、Unicode big endian和utf-8编码的文本文件的开头都会多出几个字节,分别是FFFE(Unicode),FEFF(Uicode big endian),EFBBBF(utf-8)。这些特殊的字节称为BOM(Byte order Mark),他们的用处主要在于
    1、标记文本文件的编码方式
    2、标记特殊编码方式的字节顺序

    UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

    为了解决这个问题,采用BOM。在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

    这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
(注明:
    “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。
    我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
    比如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。如果将49写在前面,就是little endian。
)

   UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

对于昨天出现的问题,在windows下采用utf-8编码保存,开始就多了'\357\273\277',他们的二进制为:
  011 101 111 010 111 011 010 111 111 可以拆分成
  0 1110 1111 0 1011 1011 0 1011 1111 就是:
  0 E       F      0  B      B       0  B      F
他们的作用就是标记这个文本文件的编码是utf-8。

小插曲,在python中,起始部分需要声明执行脚本的程序以及编码,这两个声明语句之间不能空行

#!/usr/bin/env python

# -*- coding:utf-8 -*-

  评论这张
 
阅读(569)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018