编码问题
先说说为什么会有编码问题,就拿上面那个例子来说,b机房这边数据库全是gbk编码的,因此从数据库中取出来的数据都是gbk的,从数据库中取出来的数据是gbk编码的,要在展示的时候不乱码,在不对数据库取出的数据转换的情况下,就需要发送header的时候设置编码为gbk,输出的文件(html、tpl等)都必须是gbk的,看看下面这个图会更清楚点:
db(gbk) => php等(编码格式不限但如果代码文件中有汉字,文件就要是gbk编码或者在汉字输出的时候转化为gbk) => header(gbk) => html、tpl(gbk)
或者还有一种方式只在出库的时候在代码中将utf8转化为gbk,总的来说utf8还是更流行点,问题更少点
db(gbk) => php等(utf8,并将从数据库取出的数据转化为utf8) => header(utf8) => html、tpl(utf8)
只要按照上面这两种规范编码格式,就不会出现乱码情况,起码我测试的第一种方式是没问题的,所以我猜第二种也ok,好了,现在就来写一个转换文件编码格式的小脚本:
#!/usr/bin/python# -*- coding: utf-8 -*-#filename:changeencode.pyimport osimport sysdef changeencode(file,fromencode,toencode): try: f=open(file) s=f.read() f.close() u=s.decode(fromencode) s=u.encode(toencode) f=open(file,w); f.write(s) return 0; except: return -1;def do(dirname,fromencode,toencode): for root,dirs,files in os.walk(dirname): for _file in files: _file=os.path.join(root,_file) if(changeencode(_file,fromencode,toencode)!=0): print [转换失败:]+_file else: print [成功:]+_filedef checkparam(dirname,fromencode,toencode): encode=[utf-8,gbk,gbk,utf-8] if(not fromencode in encode or not toencode in encode): return 2 if(fromencode==toencode): return 3 if(not os.path.isdir(dirname)): return 1 return 0if __name__==__main__: error={1:第一个参数不是一个有效的文件夹,3:源编码和目标编码相同,2:您要转化的编码不再范围之内:utf-8,gbk} dirname=sys.argv[1] fromencode=sys.argv[2] toencode=sys.argv[3] ret=checkparam(dirname,fromencode,toencode) if(ret!=0): print error[ret] else: do(dirname,fromencode,toencode)
脚本很简单,使用也很简单
复制代码 代码如下:
./changeencode.py target_dir fromencode toencode
这里要注意下,几种常见编码的关系:
us-ascii编码是utf-8编码的一个子集,这个是从stackoverflow上得到的,原文如下ascii is a subset of utf-8, so all ascii files are already utf-8 encoded,
我试了下确实是的,在不加汉字的时候显示编码为us-ascii,加了汉字之后,变为utf-8。
还有就是asni编码格式,这代表是本地编码格式,比如说在简体中文操作系统下,asni编码就代表gbk编码,这点还需要注意
还有一点就是一个在linux下查看文件编码格式的命令是:
file -i *
可以看到文件的编码格式。
当然了,上面的可能有些文件中有特殊字符,处理的时候会失败,但一般程序文件是没有问题的。
以上所述就是本文的全部内容了,希望大家能够喜欢。