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)編碼。如果輸出的字元在內碼表之內,就不會出現問題。如果出現了,可以:
-
執行CMD;
-
輸入 CHCP,回車檢視當前的編碼;
-
輸入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()來說,這個方法比較不容易在編碼上出現問題。
所以可以在讀取的時候指定編碼,這樣可以避免很多問題
相關推薦
window下python中文亂碼問題
中文編碼問題是用中文的程式設計師經常頭大的問題,在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
window下python安裝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 命令
完美解決Window下Python多版本共存/切換
Win10 修改環境變數,不用重啟或登出賬號;只需每次執行Python前管理員許可權執行bat,修改環境變數,重新開啟cmd即可立即切換python。方法: 1. Python多版本安裝目錄儘量在一起,比如: 1. 系統變數PATH裡新增python路徑"%Whi
idea ssm專案出現日誌中文亂碼,封裝的json中的msg欄位中文亂碼(但是json封裝的bean中的欄位不亂碼)等其他各種專案下的中文亂碼解決方案
開頭劃重點!(敲黑板):rebuild和mvn package的迴圈往復好幾次的操作是解決這個問題的最主要的方法! 經過多次試驗,發現這樣做就可以正常顯示中文了 我說為什麼有時候亂碼,有時候中文正常,原來下面的這些地方都必須設定好,特別是 rebuild和m
linux下mysql中文亂碼(中文問號)解決辦法
安裝完的MySQL的預設字符集為 latin1 ,為了要將其字符集改為使用者所需要的(比如utf8),就必須改其相關的配置檔案;由於linux下MySQL的預設安裝目錄分佈在不同的檔案下;不像windows一樣放在同一目錄下,只需修改其中的my.ini檔案,重起後就生效了;所以先來看看linux下M
linux 下navicat 中文亂碼終極解決方案
navicat 也是夠了,直接用了個wine包裝navicat 成了linux版本的了,對此表示無語 此前有很多人說,要更改startnavicat指令碼中的 lang 很明確的說沒有成功,因為 根本不是那的事, 是因為wine的事 解決辦法: 安裝 文泉驛字型
解決linux下Eclipse中文亂碼問題
已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top --- 把Windows下的工程匯入到了Linux下Eclipse中,由於以前的工程程式碼,都是GBK編碼的(Windows下
python 中文亂碼問題深入分析
一直以來,python中的中文編碼就是一個極為頭大的問題,經常丟擲編碼轉換的異常,python中的str和unicode到底是一個什麼東西呢? 在本文中,以'哈'來解釋作示例解釋所有的問題,“哈”的各種編碼如下: 1. UNICODE (UTF8-16),C854; 2. UTF-8,E59388; 3.
window下python模組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。 可以有三種方法解決該問題,分