1. 程式人生 > >window下python中文亂碼問題

window下python中文亂碼問題

中文編碼問題是用中文的程式設計師經常頭大的問題,在python下也是如此。

我們要知道python內部使用的是unicode編碼,而外部卻要面對千奇百怪的各種編碼,比如作為中國程式經常要面對的gbk,gb2312,utf8等,那這些編碼是怎麼轉換成內部的unicode呢?

一:原始碼檔案的編碼格式

   python預設會認為原始碼檔案是asci編碼。

s1='hello'

print s1

python認為這個'hello'就是一個asci編碼的字元。在僅僅使用英文字元的情況下一切正常,但是如果用了中文,比如:

s1='你好'

print s1

這個程式碼檔案被執行時就會出錯。python預設將程式碼檔案內容當作asci編碼處理,但asci編碼中不存在中文,因此丟擲異常。

解決方法就是讓python知道檔案中使用的是什麼編碼。只需在程式碼檔案的最前端新增如下:

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

表示我這個檔案裡的文字是用utf-8編碼的,這樣,python就會依照utf-8的編碼形式解讀其中的字元,然後轉換成unicode編碼內部處理使用。

二:window下控制檯編碼

Python 的 print 語句。它的功能是向控制檯輸出字元,這本身不是問題。但是 Python 內部是支援 Unicode 字串的,而 Unicode 字串在用 print 輸出時 print 要進行一次從 Unicode 到 ANSI/MBCS 編碼的編碼,編碼後才會以 8-bit 流輸出結果。

編碼就編碼吧,這也是很正常的。對於控制檯程式來說,輸出可能被重定向到文字檔案。如果不指定編碼,重定向時就不知道以何種 8-bit 位元組流寫入文字檔案,所以,輸出到控制檯的東西理論上也應該是經過編碼的 8-bit 流。綜上所述,確實有必要進行一次 WCHAR 到 char 的轉碼。

但是問題在於,Python 的 print 語句在轉碼時,居然用的是 strict 規則。即,待輸出字串若含有當前內碼表之外的字元,就會在轉碼過程中出現不可轉碼的文字,從而丟擲 exception。print 語句又不處理這個 exception,導致一個平平常常 print 語句竟然會引起 Python 程式的異常!

解決方法一:

CHCP

CHCP是MS DOS中的命令,用來顯示或設定活動內碼表編號的。用法是:

CHCP [nnn]

其中nnn指定的是內碼表的編號。這個引數是可選的,在命令列下如果不指定這個內碼表編號,那麼預設是顯示當前的內碼表編號。比如,在預設的cmd視窗中,我們輸入chcp,顯示的將類似:

活動的內碼表: 936
這裡的936表示當前使用的是簡體中文(GB2312)編碼。如果輸出的字元在內碼表之內,就不會出現問題。如果出現了,可以:

  1. 執行CMD;

  2. 輸入 CHCP,回車檢視當前的編碼;

  3. 輸入CHCP 65001,回車;(指定為utf-8)

這時候,你的Console裡面,應該支援UTF8了。

三:檔案讀取

其中,關於open的編碼解釋如下:

     讀取時:內建的open()方法開啟檔案時,read()讀取的是str,讀取後需要使用正確的編碼格式進行decode()。write()寫入時,如果引數是unicode,則需要使用你希望寫入的編碼進行encode(),如果是其他編碼格式的str,則需要先用該str的編碼進行decode(),轉成unicode後再使用寫入的編碼進行encode()。如果直接將unicode作為引數傳入write()方法,Python將先使用原始碼檔案宣告的字元編碼進行編碼然後寫入。

    編碼時:模組codecs提供了一個open()方法,可以指定一個編碼開啟檔案,使用這個方法開啟的檔案讀取返回的將是unicode。寫入時,如果引數是unicode,則使用open()時指定的編碼進行編碼後寫入;如果是str,則先根據原始碼檔案宣告的字元編碼,解碼成unicode後再進行前述操作。相對內建的open()來說,這個方法比較不容易在編碼上出現問題。

   所以可以在讀取的時候指定編碼,這樣可以避免很多問題

相關推薦

windowpython中文亂碼問題

中文編碼問題是用中文的程式設計師經常頭大的問題,在python下也是如此。 我們要知道python內部使用的是unicode編碼,而外部卻要面對千奇百怪的各種編碼,比如作為中國程式經常要面對的gbk,gb2312,utf8等,那這些編碼是怎麼轉換成內部的unicode呢?

Win7 Python中文正則的奇異表現

window rep logs ice 所有 windows 版權 命令 參考 首先貼Win32下的直接Python shell下的測試結果: Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 b

windowpython安裝pip

安裝 pan python exe script python3.5 技術 .exe 運行 python3.5 1.cmd下運行python -m pip install -U pip 2.Path添加python安裝目錄下的\Scripts,有pip.exe文件

Python中文亂碼

cnblogs 文件 -s 分享 -1 ont logs 中文 src 用Python讀取txt文件時,發現讀出來的是亂碼: 用GEdit看了一下要讀取的文件,發現編碼用的是UTF-16,於是改成UTF-8從新保存: 然後就正常了: Python中文亂碼

window Python環境搭建

一 。安裝Python        python官方網站:http://www.python.org下載python的安裝包,執行安裝即可。       python安裝是否成功,cmd開啟命令列輸入 python 命令

完美解決WindowPython多版本共存/切換

 Win10 修改環境變數,不用重啟或登出賬號;只需每次執行Python前管理員許可權執行bat,修改環境變數,重新開啟cmd即可立即切換python。方法: 1. Python多版本安裝目錄儘量在一起,比如: 1. 系統變數PATH裡新增python路徑"%Whi

idea ssm專案出現日誌中文亂碼,封裝的json中的msg欄位中文亂碼(但是json封裝的bean中的欄位不亂碼)等其他各種專案中文亂碼解決方案

   開頭劃重點!(敲黑板):rebuild和mvn package的迴圈往復好幾次的操作是解決這個問題的最主要的方法! 經過多次試驗,發現這樣做就可以正常顯示中文了 我說為什麼有時候亂碼,有時候中文正常,原來下面的這些地方都必須設定好,特別是 rebuild和m

linuxmysql中文亂碼(中文問號)解決辦法

安裝完的MySQL的預設字符集為 latin1 ,為了要將其字符集改為使用者所需要的(比如utf8),就必須改其相關的配置檔案;由於linux下MySQL的預設安裝目錄分佈在不同的檔案下;不像windows一樣放在同一目錄下,只需修改其中的my.ini檔案,重起後就生效了;所以先來看看linux下M

linux navicat 中文亂碼終極解決方案

navicat 也是夠了,直接用了個wine包裝navicat 成了linux版本的了,對此表示無語 此前有很多人說,要更改startnavicat指令碼中的 lang 很明確的說沒有成功,因為 根本不是那的事, 是因為wine的事  解決辦法: 安裝 文泉驛字型

解決linuxEclipse中文亂碼問題

已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top ---        把Windows下的工程匯入到了Linux下Eclipse中,由於以前的工程程式碼,都是GBK編碼的(Windows下

python 中文亂碼問題深入分析

一直以來,python中的中文編碼就是一個極為頭大的問題,經常丟擲編碼轉換的異常,python中的str和unicode到底是一個什麼東西呢? 在本文中,以'哈'來解釋作示例解釋所有的問題,“哈”的各種編碼如下: 1. UNICODE (UTF8-16),C854; 2. UTF-8,E59388; 3.

windowpython模組nmap安裝使用

我是直接用pip安裝的,需要安裝nmap,和python-nmap模組。 使用 nmap.PortScanner(),報錯“‘nmap’ has no ‘PortScanner’ attribute”,進入原始檔中檢視,檔案中沒有PortScanner類。   解決方法 下

mysql在Windows7出現中文亂碼解決的方法(原來是編碼的問題)

因為win7的命令視窗是預設編碼格式gbk(不建議改成utf8格式麻煩),一般mysql預設編碼格式utf8所以在命令視窗中文會出現亂碼。解決的方法如下:在mysql安裝路徑下的檔案my.ini將裡面的編碼格式改成如下的格式(修改之前一定要將mysql服務停止):

python 中文亂碼 list 亂碼處理

list 亂碼 data_list = ["中文"] print str(data_list).decode("string_escape") mysql 獲取中文亂碼 db = MySQLdb.connect(host="zxx", port=3306, user="root", passwd="12

eclipse python中文亂碼

首先要確保eclipse編輯器環境的編碼為utf8,這個是大前提;其次如果py檔案中含有中文字元的話,需要在py檔案 中對編碼進行宣告。 1. 修改eclipse編輯器編碼 a) window->preferences->general->editor

ubuntu系統matplotlib中文亂碼問題

在ubuntu 下利用matplotlib 繪圖的時候,影象上中文無法顯示。以下是我的解決辦法: 1. 下載中文字型simhei.ttf, 網址為http://fontzone.net/download/simhei 2. 搜尋 matplotlib 字型

linux開啟中文亂碼,set fileencoding 為latin1

2.http://www.cnblogs.com/joeyupdo/archive/2013/03/03/2941737.html 以下為copy連結2中的介紹 (1)encoding: Vim 內部使用的字元編碼方式,包括 Vim 的 buffer

解決Sublime Text 3在GB2312編碼中文亂碼問題

為了方便演示,首先建立了一個GB2312編碼的txt檔案,我們使用Sublime開啟後的效果如下圖,注意看sublime的左下角,除了行列資訊並無其他,一般而言,說明sublime是按照UTF8編碼開啟的檔案: 為了解決編碼問題,需要安裝ConvertToUTF8外掛,

解決idea工具tomcat中文亂碼問題及AJAX/GET請求亂碼的問題

參考連結:       (1) 使用GET方法時,查詢字串(鍵值對)被附加在URL地址後面一起傳送到伺服器,如/test/demo.jsp?name1=value1&name2=value2,而在url中的字元只能是ASCII碼,對於非ASCII碼的字元

Ubuntu Server 命令列中文亂碼(菱形圖示)的解決方案

如果Ubuntu Server在安裝過程中,選擇的是中文(很多新手都會在安裝時選擇中文,便於上手),這樣在完成安裝後,系統預設的語言將會是中文zh_CN.UTF-8。但問題是我們安裝的是伺服器,只需要執行命令列終端,但在終端下無法正常的顯示預設中文編碼zh_CN.UTF-8。 可以有三種方法解決該問題,分