python中的代码编码格式转换问题


Posted in Python onJune 10, 2015

刚来这个公司,熟悉了环境,老大就开始让我做一个迁移、修改代码的工作,我想说的是,这种工作真没劲~~,看别人的代码、改别人的代码、这里改个变量、那里改个文件名······,都是些没技术含量、很繁琐的事情,不过通过迁移代码顺便熟悉下环境也好。扯了这么多,说说今天的主题吧——代码编码格式改变,由于某些原因,需要将代码从A机房迁移到B机房,这两个之间不能互相访问,但是历史原因导致A机房的代码全是utf8编码的,B机房要求是GBK编码,看看这个怎么解决。

编码问题

先说说为什么会有编码问题,就拿上面那个例子来说,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.py
import os
import sys

def 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 "[成功:]"+_file

def 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 0

if __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 *

可以看到文件的编码格式。

当然了,上面的可能有些文件中有特殊字符,处理的时候会失败,但一般程序文件是没有问题的。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Python 相关文章推荐
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
详解Python中的文件操作
Aug 28 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
Python2中文处理纪要的实现方法
Mar 10 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
关于Python的一些学习总结
May 25 Python
python 获取键盘输入,同时有超时的功能示例
Nov 13 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
python中threading开启关闭线程操作
May 02 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
Pycharm配置lua编译环境过程图解
Nov 28 Python
python实现数独算法实例
Jun 09 #Python
python中的全局变量用法分析
Jun 09 #Python
python简单实现计算过期时间的方法
Jun 09 #Python
Python扫描IP段查看指定端口是否开放的方法
Jun 09 #Python
Python实现数据库编程方法详解
Jun 09 #Python
Python读写文件方法总结
Jun 09 #Python
六个窍门助你提高Python运行效率
Jun 09 #Python
You might like
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
来自qq的javascript面试题
2010/07/24 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
javascript每日必学之继承
2016/02/23 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
接待员岗位责任制
2014/02/10 职场文书
邀请函样本
2015/02/02 职场文书
六一儿童节致辞
2015/07/31 职场文书
学校标语口号大全
2015/12/26 职场文书
九年级数学教学反思
2016/02/17 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL
数据设计之权限的实现
2022/08/05 MySQL