Python中文編碼問題詳解

中文編碼問題是用中文的程序員經常頭大的問題,在python下也是如此,那么應該怎么理解和解決python的編碼問題呢?

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

首先我們先看一下源代碼文件中使用字符串的情況。源代碼文件作為文本文件就必然是以某種編碼形式存儲代碼的,python默認會認為源代碼文件是ascii編碼,比如說代碼中有一個變量賦值:

s1=’a’ 
print s1
python認為這個’a'就是一個asci編碼的字符。在僅僅使用英文字符的情況下一切正常,但是如果用了中文,比如:
s1=’哈’ 
print s1
這個代碼文件被執行時就會出錯,就是編碼出了問題。python默認將代碼文件內容當作ascii編碼處理,但ascii編碼中不存在中文,因此拋出異常。
解決問題之道就是要讓python知道文件中使用的是什么編碼形式,對于中文,可以用的常見編碼有utf-8,gbk和gb2312等。只需在代碼文件的最前端添加如下:
# -*- coding: utf-8 -*-
這就是告知python我這個文件里的文本是用utf-8編碼的,這樣,python就會依照utf-8的編碼形式解讀其中的字符,然后轉換成unicode編碼內部處理使用。

不過,如果你在Windows控制臺下運行此代碼的話,雖然程序是執行了,但屏幕上打印出的卻不是哈字。這是由于python編碼與控制臺編碼的不一致造成的。Windows下控制臺中的編碼使用的是gbk,而在代碼中使用的utf-8,python按照utf-8編碼打印到gbk編碼的控制臺下自然就會不一致而不能打印出正確的漢字。


解決辦法一個是將源代碼的編碼也改成gbk,也就是代碼第一行改成:
# -*- coding: gbk -*-
另一種方法是保持源碼文件的utf-8不變,而是在’哈’前面加個u字,也就是:
s1=u’哈’ 
print s1
這樣就可以正確打印出’哈’字了。
這里的這個u表示將后面跟的字符串以unicode格式存儲。python會根據代碼第一行標稱的utf-8編碼識別代碼中的漢字’哈’,然后轉換成unicode對象。如果我們用type查看一下’哈’的數據類型type(‘哈’),會得到<type ‘str’>,而type(u’哈’),則會得到<type ‘unicode’>,也就是在字符前面加u就表明這是一個unicode對象,這個字會以unicode格式存在于內存中,而如果不加u,表明這僅僅是一個使用某種編碼的字符串,編碼格式取決于python對源碼文件編碼的識別,這里就是utf-8。

Python在向控制臺輸出unicode對象的時候會自動根據輸出環境的編碼進行轉換,但如果輸出的不是unicode對象而是普通字符串,則會直接按照字符串的編碼輸出字符串,從而出現上面的現象。
使用unicode對象的話,除了這樣使用u標記,還可以使用unicode類以及字符串的encode和decode方法。
unicode類的構造函數接受一個字符串參數和一個編碼參數,將字符串封裝為一個unicode,比如在這里,由于我們用的是utf-8編碼,所以unicode中的編碼參數使用’utf-8′將字符封裝為unicode對象,然后正確輸出到控制臺:
s1=unicode(‘哈’, ‘utf-8′) 
print s1


另外,用decode函數也可以將一個普通字符串轉換為unicode對象。很多人都搞不明白python字符串的decode和encode函數都是什么意思。這里簡要說明一下:

decode是將普通字符串按照參數中的編碼格式進行解析,然后生成對應的unicode對象,比如在這里我們代碼用的是utf-8,那么把一個字符串轉換為unicode就是如下形式:
s2=’哈’.decode(‘utf-8′)
這時,s2就是一個存儲了’哈’字的unicode對象,其實就和unicode(‘哈’, ‘utf-8′)以及u’哈’是相同的
那么encode正好就是相反的功能,是將一個unicode對象轉換為參數中編碼格式的普通字符,比如下面代碼:
s3=unicode(‘哈’, ‘utf-8′).encode(‘utf-8′)
s3現在又變回了utf-8的’哈’。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451528.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP環境搭建和Apache HTTP服務器配置

所需軟件: 需要準備Apache HTTP 服務器: http://httpd.apache.org/download.cgi PHP環境下載:http://www.php.net/downloads.php Apache HTTP服務器安裝: 由于最新的 Apache 已經不提供 Windows 的安裝版本了&#xff0c;所以我們這里使用的是解壓版。 下載地址&#xff1a;htt…

ElasticSearch安裝過程中遇到的一些問題

問題1&#xff1a; 安裝Elasticsearch5.X版本&#xff0c;不修改默認配置的情況下&#xff0c;一切還好&#xff0c;能夠正常啟動。但我必須開通外網訪問。然后報錯了&#xff0c;報錯信息如下&#xff1a; ERROR: max file descriptors [1024] for elasticsearch process like…

Java原子操作類AtomicInteger應用場景

參考文章&#xff1a;Java原子操作類AtomicInteger應用場景 感謝作者分享&#xff01;

漂泊的足跡

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 似乎有河一樣的蔓延 流淌過我被陽光翻曬過的身軀 你的足跡 是遙遠的一個小島 從不知名的地方漂泊而來

什么是MD5

MD5是message-digest algorithm 5&#xff08;信息-摘要算法&#xff09;的縮寫&#xff0c;被廣泛用于加密和解密技術上&#xff0c;它可以說是文件的“數字指紋”。任何一個文件&#xff0c;無論是可執行程序、圖像文件、臨時文件或者其他任何類型的文件&#xff0c;也不管它…

selenium使用js進行點擊

WebElement button driver.findElement(By.xpath("/html/body/div[1]/div[3]/h2/div[2]")); JavascriptExecutor js (JavascriptExecutor) driver; js.executeScript("arguments[0].click();", button);當你使用driver原生API如果發現報錯&#xff0c;或…

screenX clientX pageX的區別

screenX:鼠標位置相對于用戶屏幕水平偏移量&#xff0c;而screenY也就是垂直方向的&#xff0c;此時的參照點也就是原點是屏幕的左上角。 clientX:跟screenX相比就是將參照點改成了瀏覽器內容區域的左上角&#xff0c;該參照點會隨之滾動條的移動而移動。 pageX&#xff1a;參照…

進程的五種狀態和線程的六種狀態

參考文章&#xff1a; 進程的狀態轉換和線程的狀態轉換

談談對程序員的培養

這篇文章是我好久以來的想法&#xff0c;有一些感悟&#xff0c;有一些激烈的言辭&#xff0c;我很自豪我就是一名程序員&#xff0c;我希望給程序員或者前程序員們帶來一點啟發。也許你認可我的言辭&#xff0c;也許你不屑我的觀點&#xff0c;無論如何&#xff0c;歡迎談談你…

我記得

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我記得在農村一片一片金色的稻田 , 碧綠的秧苗 , 我想起有風吹過的時候那金穗一層一層的翻滾 ... 是一際熟悉于往昔的海洋 , 那火黃的…

Python實現文件md5校驗

Linux下校驗文件MD5值&#xff0c;最簡單的方法就是執行md5sum命令 md5sum filename 原本打算用subprocess調用系統命令來獲取md5值&#xff0c; [python] view plaincopy print?import subprocess,shlex cmd "md5sum filename" p subprocess(shlex.split(cmd…

Nexus 安裝(Linux 環境)

一、環境準備 安裝 JDK 1.7 二、下載 Nexus 壓縮文件 下載地址&#xff1a;http://www.sonatype.org/nexus/archived/ 三、上傳壓縮文件 四、解壓縮文件 五、配置環境變量 1、臨時配置 mvn clean package -Dmaven.test.skiptrue -Dmaven.javadoc.skiptrue命令&#xff1a;expor…

android 連接指定wifi

本文牽涉kotlin和rxjava的相關知識 //查詢wifi信息需要申請權限&#xff0c;權限工具類就不要在意了&#xff0c;重點在下面 PermissionUtils.permission(PermissionConstants.LOCATION).callback(object : PermissionUtils.SimpleCallback {override fun onGranted() {//通過授…

英特爾預計5年內將成智能手機芯片大廠

北京時間4月26日早間消息&#xff0c;英特爾預計&#xff0c;英特爾在未來5年內將成為智能手機芯片市場的“重要參與者”。過去10年中&#xff0c;英特爾在這一市場的多次嘗試都未能獲得成功。 英特爾CFO斯泰西史密斯(Stacy Smith)表示&#xff1a;“英特爾并不滿足于成為市場中…

java.util.UnknownFormatConversionException: Conversion = ‘,‘ 解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 報錯&#xff1a; 2. 原因&#xff1a; 出錯代碼&#xff1a; if(info.getRiceCount() < 0){ ... } 事實上 對象的riceCoun屬性值…

JAVA中獲取當前系統時間

一. 獲取當前系統時間和日期并格式化輸出: import java.util.Date; import java.text.SimpleDateFormat;public class NowString { public static void main(String[] args) { SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式Sys…

爬蟲中的關于字符串的一些理解

1.基本概念 字符(Character)是各種文字和符號的總稱&#xff0c;包括各國家文字、標點符號、圖形符號、數字等 字符集(Character set)是多個字符的集合 字符集包括&#xff1a;ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等 ASCII編碼是1個字節&#xff0c;而Uni…

分布式數據一致性

分布式系統數據一致性問題 感謝作者分享&#xff01;

HttpServletRequest中獲取IP值

獲取IP值&#xff1a; public class IpAdrressUtil {/*** 獲取Ip地址* param request* return*/private static String getIpAdrress(HttpServletRequest request) {String Xip request.getHeader("X-Real-IP");String XFor request.getHeader("X-Forwarded-F…

國外較好的IT網站

最近有些讀者給我來信說很喜歡這個網站上的文章&#xff0c;并且也想通過翻譯學習英文&#xff0c;他們詢問我這些文章的英文原文是從哪里找到的? 外刊IT評論上的翻譯的英文來源很雜&#xff0c;我總結了一下&#xff0c;大概有幾個 集中的出處&#xff0c;下面列舉出來供大家…