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判断字符串与大小写转换
Jun 08 Python
Python实现比较两个列表(list)范围
Jun 12 Python
Python中元组,列表,字典的区别
May 21 Python
实例讲解python中的序列化知识点
Oct 08 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
Pandas数据类型之category的用法
Jun 28 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 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 memcache扩展的三种安装方法
2009/04/26 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
jquery 无限级联菜单案例分享
2013/03/26 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
2020/04/16 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
深入理解Python中装饰器的用法
2016/06/28 Python
Numpy数组的保存与读取方法
2018/04/04 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
Python for循环与range函数的使用详解
2019/03/23 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
50岁生日感言
2014/01/23 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python
实现GO语言对数组切片去重
2022/04/20 Golang
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL