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爬虫常用的模块分析
Aug 29 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
Python高级用法总结
May 26 Python
python连接mongodb密码认证实例
Oct 16 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
python实现文件助手中查看微信撤回消息
Apr 29 Python
Django中的FBV和CBV用法详解
Sep 15 Python
Python实现屏幕录制功能的代码
Mar 02 Python
Python基于requests实现模拟上传文件
Apr 21 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
python中uuid模块实例浅析
Dec 29 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 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
在字符串中把网址改成超级链接
2006/10/09 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
PHP attributes()函数讲解
2019/02/03 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
js模糊查询实例分享
2016/12/26 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
Python的Django框架中settings文件的部署建议
2015/05/30 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
2014年情人节活动方案
2014/02/16 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android