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 25 Python
python实现在sqlite动态创建表的方法
May 08 Python
Python中基本的日期时间处理的学习教程
Oct 16 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
Mar 13 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
对Python协程之异步同步的区别详解
Feb 19 Python
使用python创建生成动态链接库dll的方法
May 09 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
使用Python爬取Json数据的示例代码
Dec 07 Python
解决pytorch读取自制数据集出现过的问题
May 31 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 缓冲的免费实现方法
2006/10/09 PHP
一个php作的文本留言本的例子(三)
2006/10/09 PHP
php 中英文语言转换类代码
2011/08/11 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
详解Python的单元测试
2015/04/28 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python处理数据,存进hive表的方法
2018/07/04 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
django 信号调度机制详解
2019/07/19 Python
Python实现元素等待代码实例
2019/11/11 Python
pymysql的简单封装代码实例
2020/01/08 Python
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
Pretty Green美国:英式摇滚服饰风格代表品牌之一
2019/01/23 全球购物
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
酒店节能降耗方案
2014/05/08 职场文书
雷锋的观后感
2015/06/10 职场文书
员工安全责任协议书
2016/03/22 职场文书
深入理解go缓存库freecache的使用
2022/02/15 Golang