今天在尝试Python的CGI模块时遇到中文字符不能正确显示的问题,很郁闷.

在网上仔细找了找,终于解决了这个问题,现在将解决方

法陈述如下,以防下次失误.

页面源代码如下

#-*- coding: utf8 -*-

import cgitb , cgi

cgitb.enable()

form = cgi.FieldStorage()

if (form.has_key("name") and

form.has_key("addr")):

print "

name:", form["name"].value

print "

addr:", form["addr"].value

[这里仅仅测试addr参数为中文]接收Ascii字符时运行良好,但是接收中文字符时显示乱码,

浏览器切换到GB2312编码时,可

以正常显示,但是个人要求它成为UTF-8编码显示

改成 print "

addr:", form["addr"].value.encode("utf-8")

就报如下错误:

UnicodeDecodeError: "utf8" codec can"t decode bytes in position

0-1: invalid data

Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。

编码是 unicode ->

str,相反的,解码就 是 str -> unicode。

剩下的问题就是确定何时需要进行编码或者解码了.关于文件开头的"编码指

示",

也就是 # -*- coding: -*- 这个语句。Python 默认脚本文件都是 UTF-8 编码的,

当文件中有非

UTF-8 编码范围内的字符的时候就要使用"编码指示"来修正.

关于

sys.defaultencoding,这个在解码没有明确指明解码方式的时候使用。

比如我有如下代码:

#! /usr/bin/env python

# -*- coding: utf-8

-*-

s = "中文"  # 注意这里的 str 是 str 类型的,而不是 unicode

s.encode("gb18030")

这句代码将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。

因为 s 本身就是

str 类型的,因此 Python 会自动的先将 s 解码为 unicode ,

然后再编码成

gb18030。因为解码是python自动进行的,我们没有指明解码方式,

python 就会使用 sys.defaultencoding

指明的方式来解码。

很多情况下 sys.defaultencoding 是 ANSCII,如果 s 不是这个类型就会出错。

拿上面的

情况来说,我的 sys.defaultencoding 是 anscii,

而 s 的编码方式和文件的编码方式一致,是 utf8

的,所以出错了:

UnicodeDecodeError: "ascii" codec can"t decode byte 0xe4 in

position

0: ordinal not in range(128)

对于这种情况,我们有两种方法来改正错误:

是明确的指示出 s 的编码方式

#! /usr/bin/env python

# -*- coding: utf-8 -*-

s = "中文"

s.decode("utf-8").encode("gb18030")

二是更改 sys.defaultencoding 为文件的编码方式

#! /usr/bin/env python

# -*- coding: utf-8 -*-

import sys

reload(sys) # Python2.5 初始化后会删除

sys.setdefaultencoding 这个方法,我们需要重新载入

sys.setdefaultencoding("utf-8")

str = "中文"

str.encode("gb18030")

看完之后,改成这样

print "

addr:",

form["addr"].value.decode("gb2312").encode("utf-8")

成功通过.

我总结一下为什么要这么写的原因:

1. 当取回来的数据与你当前脚本中声明的编码不一致时就要做编码转换

2.在编码转换时首先要将该数据以自身编码的格式换成unicode码,再将这个unicode按utf8编码

3.为什么我的浏览器会传回gb2312的编码数据到服务器,这应该和客户端的系统编码有关系

这里顺便转载一下,关于Python 操作Mysql的中文问题:

Python操作MySQL以及中文乱码的问题

下面几个措施,保证MySQL的输出没有乱麻:

1 Python文件设置编码 utf-8 (文件前面加上

#encoding=utf-8)

2 MySQL数据库charset=utf-8

3

Python连接MySQL是加上参数 charset=utf8

4 设置Python的默认编码为 utf-8

(sys.setdefaultencoding(utf-8)

Java代码

#encoding=utf-8

import sys

import

MySQLdb

reload(sys)

sys.setdefaultencoding("utf-8")

db=MySQLdb.connect(user="root",charset="utf8")

cur=db.cursor()

cur.execute("use mydb")

cur.execute("select * from mytb limit

100")

f=file("/home/user/work/tem.txt","w")

for

i in cur.fetchall():

f.write(str(i))

f.write(" ")

f.close()

cur.close()

#encoding=utf-8

import sys

import MySQLdb

reload(sys)

sys.setdefaultencoding("utf-8")

db=MySQLdb.connect(user="root",charset="utf8")

cur=db.cursor()

cur.execute("use

mydb")

cur.execute("select * from mytb limit 100")

f=file("/home/user/work/tem.txt","w")

for i in cur.fetchall():

f.write(str(i))

f.write(" ")

f.close()

cur.close()

python编码-python中处理中文编码问题相关推荐

  1. 如何在Python编码面试中脱颖而出

    You've made it past the phone call with the recruiter, and now it's time to show that you know how t ...

  2. python url中传递中文_Python编程:URL网址链接中的中文编码与解码

    网址链接中的中文编码 中文的gbk(GB2312)编码: 一个汉字对应两组%xx,即%xx%xx 中文的UTF-8编码: 一个汉字对应三组%xx,即%xx%xx%xx 可以利用百度进行URL编码解码 ...

  3. Python中的中文编码声明注释

    在Python中提供一种特殊的中文编码声明注释,该注释的出现主要是为了解决Python 2.x中不支持直接写中文的问题.虽然在Python 3.x中,该问题已经不存在了.但是为了规范页面的编码,同时方 ...

  4. python编码使用ascii编码_Python中的编码问题:ASCII码 Unicoden编码 UTF-8编码

    编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节 ...

  5. python编码解码的过程_使用Python过程中的编码和解码

    编码和解码的问题纠结了我很久了,对他一直只有是是而非的理解,好像是那么回事,但是又不懂,今天终于来认真解决一下这个问题,总结一下大神们的回答,做一下笔记. 首先,我们知道,计算机中的所有数据都以二进制 ...

  6. 如何解决python中编码错误的问题_【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 对于Python解析器 而Python解析器所干的事情,就是: Python解析器,根据当前的所用的字符串编码类型 此字符串编码类型,是你自己所设置的 不 ...

  7. python编码和解码_Python中的编码与解码(转)

    Python中的字符编码与解码困扰了我很久了,一直没有认真整理过,这次下静下心来整理了一下我对方面知识的理解. 文章中对有些知识没有做深入的探讨,一是我自己也没有去深入的了解,例如各种编码方案的实现方 ...

  8. python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...

    Python 2.x中的字符编码,设计的的确不好,导致初学者,甚至是即使用Python很长时间的人,都会经常遇到字符编解码方面的错误. 下面就把一些常见情,尽量的都整理出来,并给出相应的解决办法. 看 ...

  9. python替换UTF-8编码文本中任意特殊字符,包括中文符号问题:大量文本,将其中的特殊字符用空

    python替换UTF-8编码文本中任意特殊字符,包括中文符号问题:大量文本,将其中的特殊字符用空 python替换UTF-8编码文本中任意特殊字符,包括中文符号 问题: 大量文本,将其中的特殊字符用 ...

最新文章

  1. C02-程序设计基础提高班(C++)第9周上机任务-类和对象
  2. MongoDB 计划缓存的影响
  3. V4L2框架分析学习
  4. 【必须收藏】那些酷炫的深度学习网络图怎么画出来的?
  5. SAP Cloud for Customer图片渲染逻辑的调试
  6. [转载] java面试100问+参考答案
  7. 卷积面试题(最重要)
  8. 数据库为啥要使用参数绑定?
  9. String类型转换的三种方法分析
  10. App、小程序、H5,这三者该如何抉择?
  11. 两个前置摄像头_前后六颗摄像头?vivo V17 Pro率先实现升降式前置双摄
  12. maven配置testng_TestNG Maven Surefire插件配置
  13. 最新Java面试题,常见面试题及答案汇总
  14. 一种便携式导弹飞控系统外场实时仿真测试系统设计
  15. 原型工具Axure vs Mockplus ——表格对比 , 你选谁?
  16. 量子世界的测不准定律
  17. 球体积公式推导(积分)
  18. 关于html中文显示乱码
  19. 章鱼网络进展月报 | 2022.10.1-10.31
  20. 2023年全国最新会计专业技术资格精选真题及答案1

热门文章

  1. 关系查询处理 查询优化 论文_每日论文33:关系数据库中的关键词查询结果动态优化...
  2. oracle管理用户安全,oracle中管理用户的安全
  3. centos8更换yum源_基于yum进行linux系统升级--从Centos7升级到Centos8
  4. Json和XML之间的对比
  5. Python3基础教程:元类详解
  6. python实现真正的冒泡排序算法(时间复杂度优化版)!
  7. python爬虫中三种数据解析方式
  8. web前端入门学习 css(2)
  9. Python 安装第三方模块
  10. LNMP架构环境搭建之PHP、Nginx源码编译安装及其简单配置应用