您好,欢迎访问一九零五行业门户网

About字符编码

打开记事本程序notepad.exe,新建一个文本文件,内容就是一个严字,依次采用ansi,unicode,unicode big endian 和 utf-8编码方式保存。 然后,用文本编辑软件ultraedit中的十六进制功能,观察该文件的内部编码方式。 1)ansi:文件的编码就是两个字节
打开记事本程序notepad.exe,新建一个文本文件,内容就是一个严字,依次采用ansi,unicode,unicode big endian 和 utf-8编码方式保存。
然后,用文本编辑软件ultraedit中的十六进制功能,观察该文件的内部编码方式。
1)ansi:文件的编码就是两个字节d1 cf,这正是严的gb2312编码,这也暗示gb2312是采用大头方式存储的。
2)unicode:编码是四个字节ff fe 25 4e,其中ff fe表明是小头方式存储,真正的编码是4e25。
3)unicode big endian:编码是四个字节fe ff 4e 25,其中fe ff表明是大头方式存储。
4)utf-8:编码是六个字节ef bb bf e4 b8 a5,前三个字节ef bb bf表示这是utf-8编码,后三个e4b8a5就是严的具体编码,它的存储顺序与编码顺序是一致的。
utf-8编码的文件中,bom占三个字节。如果用记事本把一个文本文件另存为utf-8编码方式的话,用ue打开这个文件,切换到十六进制编辑状态就可以看到开头的fffe了。这是个标识utf-8编码文件的好办法,软件通过bom来识别这个文件是否是utf-8编码,很多软件还要求读入的文件必须带bom。可是,还是有很多软件不能识别bom。
php在设计时就没有考虑bom的问题,也就是说他不会忽略utf-8编码的文件开头bom的那三个字符。
由于必须在在bo-blog的wiki看到,同样使用php的bo-blog也一样受到bom的困扰。其中有提到另一个麻烦:“受cookie送出机制的限制,在这些文件开头已经有bom的文件中,cookie无法送出(因为在cookie送出前php已经送出了文件头),所以登入和登出功能失效。一切依赖cookie、session实现的功能全部无效。”这个应该就是wordpress后台出现空白页面的原因了,因为任何一个被执行的文件包含了bom,这三个字符都将被送出,导致依赖cookies和session的功能失效。
解决的办法嘛,如果只包含英文字符(或者说ascii编码内的字符),就把文件存成ascii码方式吧。用ue等编辑器的话,点文件->转换->utf-8转ascii,或者在另存为里选择ascii编码。如果是dos格式的行尾符,可以用记事本打开,点另存为,选ascii编码。如果包含中文字符的话,可以用ue的另存为功能,选择“utf-8 无 bom”即可。
当然在python程序中处理的时候遇到这种情况改怎么处理呢?
方法一:直接将源文件的格式修改一下,将其保存为utf-8即可,但是很多时候传过来的源文件是没法修改的,这样就行不通了。
方法二:替换,就是将其中的\xef\xbb\xbf替换为空就可以了。
vim 十六进制和文本模式切换
使用vim打开文件后,使用命令
:%!xxd 使用十六进制显示;:%!xxd -r 返回文本显示。
只有十六进制部分的修改才会被采用。右边可打印文本部分的修改忽略不计。
vim以二进制打开文件
vim -b binfile
在 vim 中将文件保为无 bom 的 utf-8 格式
查看文件格式
通常我们需要先查看文件格式是否与预期的一样,再根据结果决定是否需要修改(当然你也可以在不知道原格式的情况下直接修改),下面分别给出了查看文件编码和是否带有 bom 的命令。
# 查看文件编码。set fenc?# 查看是否带 bom。set bomb?
修改文件格式
# 设置为 utf-8 编码。set fenc=utf-8# 设置为无 bom,如需设置为带 bom 则使用 set bomb。set nobomb# 加上bom标记set bomb
使用linux命令删除utf-8编码中的bom
shell> grep -r -i -l $'^\xef\xbb\xbf' /path | xargs sed -i 's/^\xef\xbb\xbf//;q'orshell> grep -r -i -l $'^\xef\xbb\xbf' /path | xargs sed -i 's/^\xef\xbb\xbf//g'orshell> tail -c +4 old_file > new_file
如果使用svn提交代码的话,可以在pre-commit钩子里加上相关代码用以杜绝bom。
#!/bin/bashrepos=$1txn=$2svnlook=/usr/bin/svnlookfor file in $($svnlook changed -t $txn $repos | awk '/^[au]/ {print $nf}'); do if $svnlook cat -t $txn $repos $file | grep -q $'^\xef\xbb\xbf'; then echo byte order mark be found in $file 1>&2 exit 1 fidone
不含 bom 的 utf-8 才是标准形式!
带 bom 的 utf-8 就是赤裸裸的流氓!!!
不同编码的bom表示编码 十六进制表示
utf-8 ef bb bf
utf-16-be fe ff
utf-16-le ff fe
utf-32-be 00 00 fe ff
utf-32-le ff fe 00 00
utf-7 2b 2f 76和以下的一个字节:[ 38 39 2b 2f ]
en:utf-1 f7 64 4c
en:utf-ebcic dd 73 66 73
en:standard compression scheme for unicode 0e fe ff
en:bocu-1 fb ee 28及可能跟随着ff
gb-18030 84 31 95 33
vim 将文件从dos格式转换到unix格式
:set fileformat=unix:w
vim 状态栏显示 文件格式带bom
show fileencoding and bomb in the status line
http://vim.wikia.com/wiki/show_fileencoding_and_bomb_in_the_status_line
比如 [latin1], [iso-8859-15], [utf-8,b], etc.
if has(statusline) set statusline=%其实有用的就是这段:
%{\[\.(&fenc==\\?&enc:&fenc).((exists(\+bomb\)\ &&\ &bomb)?\,b\:\\).\]\ \}
原文地址:about字符编码, 感谢原作者分享。
其它类似信息

推荐信息