python 中文編碼(一)

我在學python的過程當中,遇到的第二個問題,就是中文亂碼,現在也算勉強入門了,在這裏給你們說說個人經驗,也算個新人引導吧。python

 
 
在文章裏,我會重點提到一個概念:有來有去。
即數據從哪裏來,到哪裏去?
 
====================================================
一、windows下cmd終端中的中文
C:\Documents and Settings\admin>python
Python 2.7.7 (default, Jun 1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '我是中文'
>>> ss = u'我真的是中文'
>>> s
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
>>> ss
u'\u6211\u771f\u7684\u662f\u4e2d\u6587'
>>> print s
我是中文
>>> print ss
我真的是中文
>>>
這樣看來,輸入和輸出都不會出現亂碼的,即便咱們的字符串加了u。
        1)輸入從哪裏來?
                終端
        2)輸入是什麼編碼?
                一個不知道,一個是unicode
        3)輸出是什麼編碼?
                不知道
 
2.、windows下cmd中執行py文件
    咱們先來看看代碼 test.py
#coding:utf-8
 
s = 'abc我是中文字符串'
 
ss = u'我也是中文字符串'
 
print s
 
print repr(s)
 
print ss
 
print repr(ss)
文件是以utf8 withour BOM形式存在的(後面咱們再來討論文件編碼)。
咱們在cmd終端中執行看看
D:\code>python test.py
abc鎴戞槸涓枃瀛楃涓
'abc\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
我也是中文字符串
u'\u6211\u4e5f\u662f\u4e2d\u6587\u5b57\u7b26\u4e32'
 
D:\code>
天啊,怎麼會有亂碼,怎麼能有亂碼!!我快瘋了。
stop,先別瘋,咱們來一步一步分析:
    1)輸入從哪裏來?
            廢話,從文件裏來
    2)輸入是什麼編碼?
            這個,好像一個是utf8,一個是unicode
    3)輸出是什麼編碼?
            不知道哎,不是utf8麼?
是否是看出一點點問題了?
utf8      ------>   輸出編碼             ---------> 出現亂碼
unicode ------>   輸出編碼             ---------> 不出現亂碼
那麼那麼,在文字輸出以前,咱們先轉換爲unicode,再輸出,是否是就不會有亂碼了呢?咱們來試一試
#coding:utf-8
 
s = 'abc我是中文字符串'
 
ss = u'我也是中文字符串'
 
print s
 
print repr(s)
 
# 其它字符串解碼成unicode
uu = s.decode('utf-8')
 
print uu
 
print repr(uu)
 
print ss
 
print repr(ss)
看看執行結果
D:\code>python test.py
abc鎴戞槸涓枃瀛楃涓
'abc\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
abc我是中文字符串
u'abc\u6211\u662f\u4e2d\u6587\u5b57\u7b26\u4e32'
我也是中文字符串
u'\u6211\u4e5f\u662f\u4e2d\u6587\u5b57\u7b26\u4e32'
 
D:\code>
果真沒有亂碼了。
看樣子終因而解決了一點問題,可是,遠遠不夠,由於咱們還可能遇到其它的問題。
 
三、windows下cmd中與用戶交互
爲了應對各類環境,咱們的代碼會遭遇各類問題?
好比寫好的代碼可能會在cmd中執行,可能在idle中執行,也可能在linux下執行,咱們要儘量的控制程序按照咱們的意願來工做,第一個就是不出現亂碼。
    假如咱們如今有一個代碼文件,須要用戶的輸入,咱們在cmd中執行,咱們須要明確的知道一點,咱們輸入的編碼是什麼?
    只有知道輸入的編碼是什麼?才能進行解碼成unicode,才能不出現亂碼。
    那麼,在cmd中,輸入的編碼是什麼?
在這以前,咱們先來學習下decode和encode
    1)decode 解碼,在已知字符串編碼的狀況下,轉碼爲unicode  ,好比  s.decode('utf-8'),結果爲unicode
    2)encode 編碼,在已有unicode的狀況下,轉碼爲其它編碼,好比  u.encode('utf-8'),結果爲utf-8
 
我只要說一點,你就懂了
sys.stdin.encoding
固然了,與之對應的是
sys.stdout.encoding
 
仍是看看代碼吧:
#coding:utf-8
 
import sys
 
s = raw_input()
 
print s
print repr(s)
 
u = s.decode(sys.stdin.encoding)
 
print u
print repr(u)
 
o = u.encode(sys.stdout.encoding)
 
print o
print repr(o)
cmd中運行
D:\code>python test.py
我是中文
我是中文
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
我是中文
u'\u6211\u662f\u4e2d\u6587'
我是中文
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
 
D:\code>
idle中運行
Python 2.7.7 (default, Jun 1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
我是中文
我是中文
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
我是中文
u'\u6211\u662f\u4e2d\u6587'
我是中文
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
>>>
linux中運行
root@kali:~/Desktop# python test.py
我是中文
我是中文
'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87'
我是中文
u'\u6211\u662f\u4e2d\u6587'
我是中文
'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87'
 
 
總結:
若是你知道你從哪裏來,要到哪裏去,你必定會到達那個地方。
相關文章
相關標籤/搜索