日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python编码-python中处理中文编码问题

發布時間:2025/3/19 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python编码-python中处理中文编码问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天在嘗試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()

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的python编码-python中处理中文编码问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。