日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python无法打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码...

發(fā)布時(shí)間:2025/4/16 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python无法打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【背景】

Python中的字符編碼,其實(shí)的確有點(diǎn)復(fù)雜。

再加上,不同的開(kāi)發(fā)環(huán)境和工具中,顯示的邏輯和效果又不太相同,尤其是,中文的,初級(jí)用戶,最常遇到的:

(1)在Python自帶的IDE:IDLE中折騰中文字符,結(jié)果看到的差不多都是亂碼類的東西,比如:’\xd6\xd0\xce\xc4′

(2)將一個(gè)中文字符,打印輸出到windows的cmd命令行中,看到的是亂碼

對(duì)此,此處專門整理一下,這些常見(jiàn)的現(xiàn)象,和現(xiàn)象背后的根本原因,以及如何解決這類問(wèn)題。

背景知識(shí)

其實(shí),看下面問(wèn)題之前,最好是已經(jīng)了解相關(guān)的背景知識(shí),才更容易看懂的:

1.字符編碼的基本知識(shí)

對(duì)于字符編碼本身,比如UTF-8,GBK等等,不熟悉的,不了解是啥的話,先去看:

2.Windows的cmd中的默認(rèn)是GBK編碼

這方面不了解的,也需要先去看:

中的:

3.關(guān)于IDLE

其實(shí)也要先大概了解:

Python內(nèi)部,默認(rèn)的字符編碼是,是根據(jù)操作系統(tǒng),我們多數(shù)都是Windows的中文系統(tǒng),默認(rèn)是GBK編碼。

而IDLE中,直接輸入中文字符,其實(shí)就是GBK編碼的。

4.Python中的字符串的設(shè)計(jì)

主要是:Python 2.x中的str和unicode ,和,Python 3.x中的bytes和str,之間的邏輯,轉(zhuǎn)換,和區(qū)別。

不了解的,也要先去看:

常見(jiàn)問(wèn)題:IDLE中看到類似于’\xd6\xd0\xce\xc4’,而不是我想要的中文字符

初學(xué)者,最容易遇到的問(wèn)題就是:

中文用戶,用了Python自帶的IDLE,在里面輸入中文后,結(jié)果顯示出,類似于:‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

的內(nèi)容,而不是希望看到輸出的中文字符,比如:

此現(xiàn)象的解釋是:

實(shí)際上,此處你,本身就已經(jīng)得到了,正確的,默認(rèn)的GBK編碼的,中文字符串:"我是中文"

了。只是:

IDLE這個(gè),Python自帶的IDE,不是很好用的IDE,給你顯示出來(lái),其內(nèi)部的16進(jìn)制的值而已。

1. 對(duì)于此點(diǎn),你可以去用decode去驗(yàn)證一下:Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32

Type "copyright", "credits" or "license()" for more information.

>>> "我是中文"

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

>>> "我是中文".decode("GBK")

u’\u6211\u662f\u4e2d\u6587′

>>>

其中,GBK的字符串,經(jīng)過(guò)解碼后,就可以得到Unicode的字符串了,對(duì)應(yīng)的顯示出來(lái)的是:u’\u6211\u662f\u4e2d\u6587′

此處的:

\u6211,\u662f,\u4e2d,\u6587,分別對(duì)應(yīng)著,四個(gè)中文字符:"我","是","中","文"

2. 有人會(huì)問(wèn),我怎么知道這些值,是對(duì)應(yīng)著這四個(gè)中文字符的呢?

答案是:

那是因?yàn)槟悴皇煜nicode。且也不會(huì)去查Unicode表格。

等你看了之前告訴你的:

然后再去參考我的:

去查Unicode值,就可以查到“我”對(duì)應(yīng)的Unicode值是0x6211:

同理,可以查得剩下的:

0x662f="是"=\u662f

0x4e2d="中"=\u4e2d

0x6587="文"=\u6587

3.回到上面的問(wèn)題,接著,還可以接著進(jìn)一步驗(yàn)證,之前的字符串,的確是GBK:Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32

Type "copyright", "credits" or "license()" for more information.

>>> "我是中文"

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

>>> "我是中文".decode("GBK")

u’\u6211\u662f\u4e2d\u6587′

>>> "我是中文".decode("GBK").encode("GBK")

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

即:

之前直接輸入中文字符所得到的16進(jìn)制值,和通過(guò)GBK解碼后得到Unicode,然后再編碼為GBK的16進(jìn)制的值,是一樣的

-> 說(shuō)明之前的中文字符的確是GBK的編碼。

4.另外,也可以順帶看看,UTF-8的輸出是啥:Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32

Type "copyright", "credits" or "license()" for more information.

>>> "我是中文"

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

>>> "我是中文".decode("GBK")

u’\u6211\u662f\u4e2d\u6587′

>>> "我是中文".decode("GBK").encode("GBK")

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

>>> "我是中文".decode("GBK").encode("UTF-8")

‘\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87’

所以,總結(jié)此問(wèn)題:

IDLE中輸入中文字符,但是顯示出來(lái)的是類似于’\xd6\xd0\xce\xc4’的值,而不是想要的中文字符

的答案就是:

其實(shí)本身已經(jīng)是中文字符。

只是根據(jù)當(dāng)前默認(rèn)是GBK編碼,所顯示出來(lái)的GBK編碼的內(nèi)部的值而已。

其實(shí),對(duì)此問(wèn)題,更加終極的解決辦法是:

由于IDLE不是很好用,所以不推薦用戶,尤其是初學(xué)者,直接就用IDLE來(lái)開(kāi)發(fā)Python。

而是推薦你用:

Notepad++ 加 cmd

具體的原因和解釋,詳見(jiàn):

更更終極的辦法是:

這類常見(jiàn)的錯(cuò)誤,屬于學(xué)習(xí)Python中所容易走的彎路。

而你要是按照我的教程去學(xué)習(xí),不僅可以少走很多彎路,而且更容易明白很多基本的邏輯:

初級(jí)的:

中級(jí)的:

高級(jí)專題闡述:

常見(jiàn)問(wèn)題:中文字符打印輸出顯示到命令行(Windows的cmd)顯示亂碼

和上面的現(xiàn)象類似的一個(gè)現(xiàn)象就是:

當(dāng)用python代碼,打印輸出一個(gè)中文字符到命令中,結(jié)果卻顯示亂碼。

(1)用如下代碼:#!/usr/bin/python

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

"""

-------------------------------------------------------------------------------

[Function]

【整理】Python中實(shí)際上已經(jīng)得到了正確的Unicode或某種編碼的字符,但是看起來(lái)或打印出來(lái)卻是亂碼

https://www.crifan.com/python_already_got_correct_encoding_string_but_seems_print_messy_code

[Date]

2013-07-19

[Author]

Crifan Li

[Contact]

https://www.crifan.com/about/me/

-------------------------------------------------------------------------------

"""

#---------------------------------import---------------------------------------

#------------------------------------------------------------------------------

def char_ok_but_show_messy():

"""

Demo Python already got normal chinese char, with some encoding, but print to windows cmd show messy code

"""

#此處,當(dāng)前Python文件是UTF-8編碼的,所以如下的字符串,是UTf-8編碼的

cnUtf8Char = "我是UTF-8的中文字符串";

#所以,將UTF-8編碼的字符串,打印輸出到GBK編碼的命令行(Windows的cmd)中,就會(huì)顯示出亂碼

print "cnUtf8Char=",cnUtf8Char; #cnUtf8Char= 鎴戞槸UTF-8鐨勪腑鏂囧瓧絎︿覆

#如果想要正確顯示出中文字符,不顯示亂碼的話,則有兩種選擇:

#1. 把字符串轉(zhuǎn)換為Unicode編碼,則輸出到GBK的命令行時(shí),Python會(huì)自動(dòng)將Unicode的字符串,編碼為GBK,然后正確顯示字符

decodedUnicodeChar = cnUtf8Char.decode("UTF-8");

print "decodedUnicodeChar=",decodedUnicodeChar; #decodedUnicodeChar= 我是UTF-8的中文字符串

#2. 讓字符串的編碼和輸入目標(biāo)(windows的cmd)的編碼一致:把當(dāng)前的字符串(由上述解碼后得到的Unicode再次去編碼)也變成GBK,然后輸出到GBK的命令行時(shí),就可以正確顯示了

reEncodedToGbkChar = decodedUnicodeChar.encode("GBK");

print "reEncodedToGbkChar=",reEncodedToGbkChar; #reEncodedToGbkChar= 我是UTF-8的中文字符串

###############################################################################

if __name__=="__main__":

char_ok_but_show_messy();

注意:

此時(shí)Python的文件編碼是UTF-8。

不了解的,詳見(jiàn):

(2)當(dāng)前代碼下載(右鍵另存為):

(3)還原現(xiàn)象

運(yùn)行的結(jié)果是:

(4)解釋

代碼中已經(jīng)解釋的很清楚了。

不再啰嗦。

相關(guān)帖子

和此類的,python的字符串編碼方面的相關(guān)內(nèi)容,之前有更多的總結(jié):

總結(jié)

以上是生活随笔為你收集整理的python无法打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。