电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解python中文編碼問題

瀏覽:56日期:2022-06-16 10:41:41
目錄 1.在Python中使用中文1.1 Windows控制臺1.2 Windows IDLE(在Shell上運行)1.3 在IDLE上運行代碼 1.4 Windows Eclipse1.5 從文件讀取中文1.6 在數(shù)據(jù)庫中使用中文1.7 在XML中使用中文 1.在Python中使用中文

在Python中有兩種默認的字符串:str和unicode。在Python中一定要注意區(qū)分“Unicode字符串”和“unicode對象”的區(qū)別。后面所有的“unicode字符串”指的都是python里的“unicode對象”。

事實上在Python中并沒有“Unicode字符串”這樣的東西,只有“unicode”對象。一個傳統(tǒng)意義上的unicode字符串完全可以用str對象表示。只是這時候它僅僅是一個字節(jié)流,除非解碼為unicode對象,沒有任何實際的意義。

我們用“哈哈”在多個平臺上測試,其中“哈”對應的不同編碼是:

1. UNICODE (UTF8-16), C854;

2. UTF-8, E59388;

3. GBK, B9FE。

1.1 Windows控制臺

下面是在windows控制臺的運行結(jié)果:

詳解python中文編碼問題

可以看出在控制臺,中文字符的編碼是GBK而不是UTF-16。將字符串s(GBK編碼)使用decode進行解碼后,可以得到同等的unicode對象。

注意:可以在控制臺打印ss并不代表它可以直接被序列化,比如:

詳解python中文編碼問題

向文件直接輸出ss會拋出同樣的異常。在處理unicode中文字符串的時候,必須首先對它調(diào)用encode函數(shù),轉(zhuǎn)換成其它編碼輸出。這一點對各個環(huán)境都一樣。

總結(jié):在Python中,“str”對象就是一個字節(jié)數(shù)組,至于里面的內(nèi)容是不是一個合法的字符串,以及這個字符串采用什么編碼(gbk, utf-8, unicode)都不重要。這些內(nèi)容需要用戶自己記錄和判斷。這些的限制也同樣適用于“unicode”對象。要記住“unicode”對象中的內(nèi)容可絕對不一定就是合法的unicode字符串,我們很快就會看到這種情況。

總結(jié):在windows的控制臺上,支持gbk編碼的str對象和unicode編碼的unicode對象。

1.2 Windows IDLE(在Shell上運行)

在windows下的IDLE中,運行效果和windows控制臺不完全一致:

詳解python中文編碼問題

可以看出,對于不使用“u”作標識的字符串,IDLE把其中的中文字符進行GBK編碼。但是對于使用“u”的unicode字符串,IDLE居然一樣是用了GBK編碼,不同的是,這時候每一個字符都是unicode(對象)字符!!此時len(ss) = 4。

這樣產(chǎn)生了一個神奇的問題,現(xiàn)在的ss無法在IDLE中正常顯示。而且我也沒有辦法把ss轉(zhuǎn)換成正常的編碼!比如采用下面的方法:

詳解python中文編碼問題

這有可能是因為IDLE本地化做得不夠好,對中文的支持有問題。建議在IDLE的SHELL中,不要使用u“中文”這種方式,因為這樣得到的并不是你想要的東西。

這同時說明IDLE的Shell支持兩種格式的中文字符串:GBK編碼的“str”對象,和UNICODE編碼的unicode對象。

1.3 在IDLE上運行代碼

在IDLE的SHELL上運行文件,得到的又是不同的結(jié)果。文件的內(nèi)容是:

詳解python中文編碼問題

直接運行的結(jié)果是:

詳解python中文編碼問題

毫無瑕疵,相當令人滿意。我沒有試過其它編碼的文件是否能正常運行,但想來應該是不錯的。

同樣的代碼在windows的控制臺試演過,也沒有任何問題。

1.4 Windows Eclipse

在Eclipse中處理中文更加困難,因為在Eclipse中,編寫代碼和運行代碼屬于不同的窗口,而且他們可以有不同的默認編碼。對于如下代碼:

#!/usr/bin/python# -*- coding: utf-8 -*- s = '哈哈'ss = u’哈哈’ print repr(s)print repr(ss) print s.decode(’utf-8’).encode(’gbk’)print ss.encode(’gbk’) print s.decode(’utf-8’)print ss

前四個print運行正常,最后兩個print都會拋出異常:’/xe5/x93/x88/xe5/x93/x88’u’/u54c8/u54c8’哈哈哈哈Traceback (most recent call last): File 'E:/Workspace/Eclipse/TestPython/Test/test_encoding_2.py', line 13, in <module> print s.decode(’utf-8’)UnicodeEncodeError: ’ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)

也就是說,GBK編碼的str對象可以正常打印,但是不能打印UNICODE編碼的unicode對象。在源文件上點擊“Run as”“Run”,然后在彈出對話框中選擇“Common”:

詳解python中文編碼問題

可以看出Eclipse控制臺的缺省編碼方式是GBK;所以不支持UNICODE也在情理之中。如果把文件中的coding修改成GBK,則可以直接打印GBK編碼的str對象,比如s。

如果把源文件的編碼設(shè)置成“UTF-8”,把控制臺的編碼也設(shè)置成“UTF-8”,按道理說打印的時候應該沒有問題。但是實驗表明,在打印UTF-8編碼的str對象時,中文的最后一個字符會顯示成亂碼,無法正常閱讀。不過我已經(jīng)很滿足了,至少人家沒有拋異常不是:)

BTW: 使用的Eclipse版本是3.2.1。

1.5 從文件讀取中文

在window下面用記事本編輯文件的時候,如果保存為UNICODE或UTF-8,分別會在文件的開頭加上兩個字節(jié) “/xFF/xFE” 和三個字節(jié)“/xEF/xBB/xBF”。在讀取的時候就可能會遇到問題,但是不同的環(huán)境對這幾個多于字符的處理也不一樣。

以windows下的控制臺為例,用記事本保存三個不同版本的“哈哈”。

詳解python中文編碼問題

打開utf-8格式的文件并讀取utf-8字符串后,解碼變成unicode對象。但是會把附加的三個字符同樣進行轉(zhuǎn)換,變成一個unicode字符,字符的數(shù)據(jù)值為“/xFF/xFE”。這個字符不能被打印。編碼的時候需要跳過這個字符。

詳解python中文編碼問題

打開unicode格式的文件后,得到的字符串正確。這時候適用utf-16解碼,能得到正確的unicdoe對象,可以直接使用。多余的那個填充字符在進行轉(zhuǎn)換時會被過濾掉。

詳解python中文編碼問題

打開ansi格式的文件后,沒有填充字符,可以直接使用。結(jié)論:讀寫使用python生成的文件沒有任何問題,但是在處理由notepad生成的文本文件時,如果該文件可能是非ansi編碼,需要考慮如何處理填充字符。

1.6 在數(shù)據(jù)庫中使用中文

剛剛接觸Python,我用的數(shù)據(jù)庫是mysql。在執(zhí)行插入、查找等操作時,如果運行環(huán)境使用的字符編碼和mysql不一致,就可能導致運行時的錯誤。當然,和上面看到的情況一樣,運行環(huán)境并不是關(guān)鍵因素,關(guān)鍵是查詢語句的編碼方式。如果在每次執(zhí)行查詢操作時都把查詢字符串做一次編碼轉(zhuǎn)換,轉(zhuǎn)變成mysql的默認字符編碼,一樣不會遇到問題。但是這樣寫代碼也太痛苦了吧。

使用如下代碼連接數(shù)據(jù)庫:

self.conn = MySQLdb.connect(use_unicode = 1, charset=’utf8’, **server)

我不能理解的是既然數(shù)據(jù)庫用的默認編碼是UTF-8,我連接的時候也用的是UTF-8,為什么查詢得到的文本內(nèi)容卻是UNICODE編碼(unicode對象)?這是MySQLdb庫的設(shè)置么?

1.7 在XML中使用中文

使用xml.dom.minidom和MySQLdb類似,對生成的dom對象調(diào)用toxml方法得到的是unicode對象。如果希望輸出utf-8文本,有兩種方法:

1.使用系統(tǒng)函數(shù)在輸出xml文檔的時候進行編碼,這是我覺得最好的方法。

xmldoc.toxml(encoding=’utf-8’)xmldoc.writexml(outfile, encoding = ‘utf-8’)

2.自己編碼生成

在使用toxml之后可以調(diào)用encode方法對文檔進行編碼。但這種方法無法得到合適的xml declaration(xml文檔第一行中的encoding部分)。不要嘗試通過xmldoc.createProcessingInstruction來創(chuàng)建一個processing instraction:

<?xml version=’1.0’ encoding=’utf-8’?>

xml declaration雖然看起來像是,但是事實上并不是一個processing instraction。可以通下面的方法得到一個滿意的xml文件:

print >> outfile, “<?xml version=’1.0’ encoding=’utf-8’?>”print >> outfile, xmldoc.toxml().encode(‘utf-8’)[22:]

其中第二行需要過濾掉在調(diào)用xmldoc.toxml時生成的“<?xml version=’1.0’ ?>”,它的長度是22。

相面是兩種方法的用法比較:

詳解python中文編碼問題

另外,在IDLE的shell中,不要用 u’中文’ 對屬性進行賦值。上面討論過,這樣得到的unicode字符串不正確。

到此這篇關(guān)于python中文編碼問題的文章就介紹到這了,更多相關(guān)中文編碼內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 船老大板材_浙江船老大全屋定制_船老大官网 | 污水处理设备-海普欧环保集团有限公司| 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 27PR跨境电商导航 | 专注外贸跨境电商| 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 太原装修公司_山西整装家装设计_太原室内装潢软装_肖邦家居 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 玖容气动液压设备有限公司-气液增压缸_压力机_增压机_铆接机_增压器 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 集菌仪厂家_全封闭_封闭式_智能智能集菌仪厂家-上海郓曹 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | 工业制氮机_psa制氮机厂家-宏骁智能装备科技江苏有限公司 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 压滤机滤板_厢式_隔膜_板框压滤机滤板厂家价格型号材质-大凯环保 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 连栋温室大棚建造厂家-智能玻璃温室-薄膜温室_青州市亿诚农业科技 | 贴片电感_贴片功率电感_贴片绕线电感_深圳市百斯特电子有限公司 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 礼至家居-全屋定制家具_一站式全屋整装_免费量房设计报价 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 高光谱相机-近红外高光谱相机厂家-高光谱成像仪-SINESPEC 赛斯拜克 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | 定制防伪标签_防伪标签印刷_防伪标签厂家-510品保防伪网 |