1. 程式人生 > >python2 中文編碼問題

python2 中文編碼問題

在python程式碼中,寫入中文是經常出現亂碼和錯誤。

============知識背景============

1、首先看一下系統預設編碼


就是說系統預設編碼形式為ascii。

2、現在瞭解一下ASCII和非ASCII編碼

在計算機內部,所有的資訊最終都表示為一個二進位制的字串。每一個二進位制位(bit)有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為一個位元組(byte)。上個世紀60年代,美國製定了一套字元編碼,對英語字元與二進位制位之間的關係,做了統一規定。這被稱為ASCII碼,一直沿用至今。ASCII碼一共規定了128個字元的編碼。

英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。於是出現用更多位元組編碼比如:簡體中文常見的編碼方式是GB2312,使用兩個位元組表示一個漢字,所以理論上最多可以表示256x256=65536個符號。這些屬於非ASCII編碼。

3、unicode

正如上一節所說,世界上存在著多種編碼方式,同一個二進位制數字可以被解釋成不同的符號。因此,要想開啟一個文字檔案,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。unicode編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼。

但是,需要注意的是,unicode只是一個符號集,它只規定了符號的二進位制程式碼,卻沒有規定這個二進位制程式碼應該如何儲存。這樣帶來的問題就是,計算機不知道編碼是unicode還是ascii。隨後unicode出現了多種儲存方式。

4、utf-8

UTF-8就是在網際網路上使用最廣的一種unicode的實現方式。其他實現方式還包括UTF-16和UTF-32,不過在網際網路上基本不用。重複一遍,這裡的關係是,UTF-8是Unicode的實現方式之一。

utf-8和unicode可以互相轉化,比如:漢字“嚴”的Unicode碼是4E25(100111000100101),UTF-8編碼是E4B8A5(11100100 10111000 10100101)。

在windows下,最簡單的轉化方式是記事本。用記事本開啟檔案,檔案》另存為,最下邊“編碼”可以改變編碼儲存方式:

其中:

1)ANSI是預設的編碼方式。對於英文檔案是ASCII編碼,對於簡體中文檔案是GB2312編碼。

2)Unicode編碼指的是UCS-2編碼方式,即直接用兩個位元組存入字元的Unicode碼。這個選項用的little endian格式。

3)Unicode big endian編碼與上一個選項相對應。我在下一節會解釋little endian和big endian的涵義。

4)UTF-8編碼,也就是上一節談到的編碼方法。

============python編碼============

python內部是unicode編碼,也就是說通常情況下,python用unicode作為轉換中間量,decode作用為將其他編碼字串轉換為unicode,接著encode將unicode編碼轉換為其他編碼。一段例子:

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

s="你好"# 整個檔案是UTF-8編碼,所以這裡的字串也是UTF-8
u=s.decode("utf-8")# 將utf-8的str轉換為unicode
g=u.encode('gbk')# 將unicode轉換為str,編碼為GBK
print type(s),"len=",len(s)# 輸出:<type ‘str‘> len= 6,utf-8每個漢字佔3位元組
print type(u),"len=",len(u)# 輸出:<type ‘str‘> len= 6,unicode統計的是字數
print type(g),"len=",len(g)# 輸出:g = u.encode(‘GBK‘),GBK每個漢字佔2位元組
print s# 在GBK/ANSI環境下(如Windows),輸出亂碼,#因為此時螢幕輸出會被強制理解為GBK;
print g# 在Windows下輸出“你好”

ss = '下午'.decode('utf-8')
print ss
print type(ss)

輸出為:

這樣,我們可以看到,字串utf-8和unic的相互轉化和內部儲存編碼。

============總結============

總結:

unicode是支援所有文字的統一編碼,但一般只用作文字的內部表示,檔案、網頁(也是檔案)、螢幕輸入輸出等處均需使用具體的外在編碼,如GBK、UTF-8等;

encode和decode都是針對unicode進行“編碼”和“解碼”,所以encode是unicode->str的過程,decode是str->unicode的過程;

unicode和str是一對孿生兄弟,來自basestring,所以用isinstance(s, basestring)來判斷s是否為字串。

相關推薦

python2 中文編碼問題小結

最近處理中文資料,python2各種編碼問題,看了好多部落格和文章,終於弄懂了一些,所以在這裡總結一發。供大家學習和參考! 1.編碼 (1)ASCII碼 ASCII碼是規定的最早的計算機系統將英文文字轉為數字儲存的編碼方式,一共規定了128個字元的編碼,即

python2 中文編碼問題

在python程式碼中,寫入中文是經常出現亂碼和錯誤。 ============知識背景============ 1、首先看一下系統預設編碼 就是說系統預設編碼形式為ascii。 2、現在瞭解一下

python2.7解決中文編碼問題

    粗略地介紹下編碼知識,首先我們認為是位元組是面向計算機的,字元是面向人類的,相互的轉換就是解碼和編碼,在各種編碼中,ASCII碼是7位,用不到一個位元組,7個位元來表示字元,這樣最多也只有127個字元,ISO8859-1用一個位元組8個位元表示字元,可以表示256個字

python2.7 編碼問題整理

tro 編碼方式 這樣的 創建 不同 表示 ice 文本 logs 本文轉自:http://www.cnblogs.com/fnng/p/5008884.html。 不能不說,蟲師的blog文章質量非常值得借鑒,通篇讀下來,解決了許多的問題。 鑒於良好的收藏習慣,轉載到此。

.Net Core中文編碼問題整理

figure ide 添加 run 編碼 div 方法 http read 1、添加System.Text.Encoding.CodePages包(Install-Package System.Text.Encoding.CodePages) 2、控制臺應用程序在Main方

Apache服務器URL訪問中文編碼設置

img nco eva .com usr author col div load 在/usr/local/apache/conf/httpd.conf文件末位添加以下信息: 1 #add chinese url code 2 LoadModule encoding

如何讓sublime text 2/3支持中文編碼

pat 編輯 install pri boa 安裝 source 亂碼 格式 由於每個編輯器默認編碼格式不一樣,所以大致在一些編輯器中編輯的代碼註釋在另外一些編輯器中出現亂碼。在sourceinsight裏面編輯的中文在sublime text3中出現亂碼,所以

解決全站字符亂碼(POST和GET中文編碼問題)

{} tomcat ont throws turn nco cat doget pro 1 說明 亂碼問題: 獲取請求參數中的亂碼問題; POST請求:request.setCharacterEncoding(“utf-8”); GET請求:new String(r

windows修改PowerShell(命令提示符)默認中文編碼方式

提示 lec user dex ole big gb2312 ons containe 如果以下方法都沒有作用的話,可以直接在代碼中調用<stdlib.h>中的system("mode con cp select=65001")或者是system("chcp 6

Python的解釋器和中文編碼

com ges 尋找 notepad 文件的 目錄 運行 寫法 -1 第一行 #!/usr/bin/env python 目的是指出用什麽可執行程序去運行代碼。 有兩種寫法 1、#!/usr/bin/python 調用/usr/bin下的python解釋器,去運行代碼。 這

python2,python3編碼問題引伸出的通用編碼原理解釋

Coding 理解 不同的 文本處理 解釋 .com alt 問題處理 fontsize 今天使用python2編碼時遇到這樣一條異常UnicodeDecodeError: ‘ascii’ code can’t decode byte 0

Python 中文編碼

輸出結果 開頭 ref 文件 找到 編輯器 sci .cn 文件中 Python 中文編碼 前面章節中我們已經學會了如何用 Python 輸出 "Hello, World!",英文沒有問題,但是如果你輸出中文字符"你好,世界"就有可能會碰到中文編碼問題。 Python 文件

中文編碼及萬國碼

-- 1.0 gbk 中文編碼 占用 nic post 所有 字節 字符編碼支持中文的第一張表就叫 GB2312 1980 GB2312 6700+1995 GBK1.0 200002000 GB18030 27000 big5 臺灣unicode 萬國碼 支持所有國家和

python2.x編碼問題實例

轉換成 code unicode ima clas width odin encoding detect python字符串包括str 和 unicode,可以通過type(s)確定是str還是unicodestr可以繼續細分為各種編碼例如utf-8/GBK等python內

CentOS中文編碼怎麽設置?

不能 entos 表示 elf 電腦 utf-8 系統 margin span 1.查看當前系統語言 登陸linux系統打開操作終端之後,輸入 echo $LANG可以查看當前使用的系統語言。如 2.查看安裝的語言包 查看是否有中文語言包可以在終端輸入 loc

mysql之全球化和本地化:字符集、校對集、中文編碼問題

語法 必知必會 gin 中文編碼 itl 什麽是 存儲 默認 order 本文內容: 什麽是字符集?什麽是校對集? 查看字符集和校對集 設置字符集和校對集 mysql中的中文數據問題 首發日期:2018-04-19 什麽是字符集?什麽是校對集?

IDA中文編碼設置

IDA文件目錄:cfg/ida.cfg註釋掉(cp866 version中的AsciiStringChars)// (cp866 version)//AsciiStringChars = 取消註釋(full version中的AsciiStringChars)// (full version)AsciiStr

dos中文編碼問題

dos寫個bat腳本,發現不能顯示中文 輸入 chcp 65001即可 dos中文編碼問題

CsQuery中文編碼亂碼問題

top 顯示 exception 編碼 錯誤 sage encode SQ tom 一、問題描述 InnerHTML 中文顯示為&#1052;&#1086;&#1076;&#1077;&#1083;&#1100; 二、解決方法

Python學習---JSON補充內容[中文編碼 + dumps解析]

src tom lba 占位符 display https one encoder none JSON補充內容[微信解決中文亂碼,接上]import json # 英文顯示 dic = {"hello": "world"} str = json.dumps(dic) #