編程遇到的坑之關(guān)于字符編碼

  • 先認(rèn)識(shí)一下常見(jiàn)的幾種編碼方式,記得有一個(gè)《編碼的故事》對(duì)相關(guān)的編碼發(fā)展講得很詳細(xì),可以參考一下。
    • GB2312:中國(guó)規(guī)定的漢字編碼,即簡(jiǎn)體中文的字符集編碼
    • GBK :GB2312的擴(kuò)展 ,兼容GB2312,還能顯示繁體中文與日文的假名。
    • Unicode:國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案
    • UTF-8 (8-bit Unicode Transformation Format)是最流行的一種對(duì) Unicode 進(jìn)行傳播和存儲(chǔ)的編碼方式
  • 再提一句編程過(guò)程中遇到的編碼出現(xiàn)的不同位置。我們有些時(shí)候再cmd里運(yùn)行正常,但是寫入文件就出現(xiàn)問(wèn)題的原因就是這幾個(gè)部分不一致的原因。
    • 程序文件的編碼
    • 程序運(yùn)行時(shí)環(huán)境(IDE)的編碼
    • 程序讀取的外部文件或者網(wǎng)頁(yè)的編碼
      記事本的另存為對(duì)話框里編碼ANSI就是MBCS

  1. 因?yàn)镻ython2編輯器默認(rèn)的編碼是ASCII,無(wú)法識(shí)別中文,所以我們經(jīng)常在程序的第一行加上: #coding=utf-8。通過(guò)鍵入sys.getdefaultencoding()可以了解當(dāng)前編輯系統(tǒng)的的編碼方式;除此之外python里可以使用encode('XXX')來(lái)實(shí)現(xiàn)編碼的變化,一般來(lái)說(shuō),常常使用unicode作為中間編碼方式,utf-8---unicode--gbk。
    對(duì)
import sys 
reload(sys)
sys.setdefaultencoding('utf-8')

PS:在cmd 下輸入:chcp 65001 命令回車可以改變CMD的編碼方式為utf-8, chcp 936 可以換回默認(rèn)的GBK,chcp 437 是美國(guó)英語(yǔ)

  1. 使用python將unicode編碼方式的字符串存儲(chǔ)在TXT格式下,出現(xiàn)編碼問(wèn)題:只要是中文,進(jìn)入記事本打開都是亂碼,出現(xiàn)這個(gè)問(wèn)題的原因是記事本默認(rèn)的編碼方式是ANSI,導(dǎo)致編碼直接轉(zhuǎn)化,出現(xiàn)問(wèn)題。
    對(duì)比
    嘗試了在python中修改編碼方式都沒(méi)有成功,最后嘗試將字符存儲(chǔ)的文件后綴改成log(dat之類的隨便改),編碼方式正常。
    注: 記事本可以在另存為的時(shí)候可以設(shè)置默認(rèn)的編碼方式有ANSI 、Unicode、Unicode-big-endian、UTF-8。還有一種方法:修改注冊(cè)表的方式修改記事本編碼可以長(zhǎng)久解決。
  2. 與程序相關(guān)的幾種編碼方式。比如一個(gè)中文詞:哈哈,在設(shè)置為coding:gbk的python代碼中,存儲(chǔ)在編碼為utf-8的文件中。首先獲取'哈哈'的編碼時(shí),由文件編碼格式確定,為'\xe5\x93\x88\xe5\x93\x88'。要改變編碼方式的時(shí)候,用聲明編碼處指定的編碼GBK,將'\xe5\x93\x88\xe5\x93\x88'按GBK解碼,得到就是''鍝堝搱'
  3. 使用python的encode與decode的錯(cuò)誤也很多,因?yàn)榇藭r(shí)要使用unicode作為中間編碼方式,在文件存儲(chǔ),文件解析,文件運(yùn)行結(jié)果展示的編碼不一致的時(shí)候出現(xiàn)很多問(wèn)題。在字符串編碼是unicode的時(shí)候,可以直接encode為gbk,如果是utf-8則需要先decode改為unicode之后才能encode變成gbk。
#!/usr/bin/env python 
#coding=utf-8 
s="中文" 
if isinstance(s, unicode): 
    #s=u"中文" 
    print s.encode('gb2312') 
else: 
    #s="中文" 
    print s.decode('utf-8').encode('gb2312')
  1. python獲取編碼屬性
Python獲取系統(tǒng)編碼參數(shù)的幾個(gè)函數(shù)
系統(tǒng)的缺省編碼(一般就是ascii):sys.getdefaultencoding() 
系統(tǒng)當(dāng)前的編碼:locale.getdefaultlocale() 
系統(tǒng)代碼中臨時(shí)被更改的編碼(通過(guò)locale.setlocale(locale.LC_ALL,“zh_CN.UTF-8″)):locale.getlocale() 
文件系統(tǒng)的編碼:sys.getfilesystemencoding() 
終端的輸入編碼:sys.stdin.encoding 
終端的輸出編碼:sys.stdout.encoding 

參考資料:
python 相關(guān)編碼[轉(zhuǎn)]
玩轉(zhuǎn)Python讓人討厭的編碼問(wèn)題
python常用功能介紹之一:編碼與解碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡(jiǎn)介 在編程中常??梢砸?jiàn)到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說(shuō)...
    蘭山小亭閱讀 9,068評(píng)論 0 13
  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號(hào) 簡(jiǎn)介有稍微接觸python的人就會(huì)知道,python中...
    ayuLiao閱讀 3,379評(píng)論 1 5
  • 4、MAF訓(xùn)練法 今天介紹一本書《耐力——無(wú)傷、燃脂、輕松的MAF訓(xùn)練法》及其運(yùn)動(dòng)理念。 Maf方法及特點(diǎn) 1 燃...
    鑫_fc40閱讀 481評(píng)論 0 0
  • # Spark 分析Json數(shù)據(jù)存入Mysql 遇到的坑 折騰了兩天,終算是弄好了,入的坑不計(jì)其數(shù),但是也要數(shù)一數(shù)...
    BVN閱讀 2,556評(píng)論 0 1
  • 文/蔥蔥 偶然和必然之間 有緣和無(wú)緣之間 鋪上一個(gè)世紀(jì)的塵埃 把愛(ài)講得再卑微再高尚 都無(wú)法阻止心上的月亮缺了一塊 ...
    蔥蔥_閱讀 233評(píng)論 13 19

友情鏈接更多精彩內(nèi)容