A. 文件里寫的是unicode,用python怎麼讀取成文本
先讀到內存,然後根據腳本當前編碼decode,然後再encode成你想要的編碼
eg:
#假設readString是你讀出來的字元串,你想轉成gb2312
# -*- coding: utf-8 -*-
readString.decode('utf-8').encode('gb2312') #當前腳本編碼為utf-8
B. python怎麼轉換unicode編碼
用decode()就行。decode()方法必須傳入一個參數,這個參數就是當前待轉碼的編碼,此函數方法的用意就是將當前編碼為Unicode編碼。
比如就你這提問的此頁面:
#使用版本是python2.
importurllib
url='https://..com/question/1499967322379602619.html?entry=qb_ihome_tag&hideOtherAnswer=true&newAnswer=1'
html=urllib.urlopen(url).read()
result=html.decode('gbk')
printresult
方法是絕對可行的
此法對字元串和文檔內容的解碼一樣有效。
C. 在python中unicode是什麼用法
可以列印出中文的
ss=u'網路'
print ss
就可以列印出中文
D. python怎麼把unicode碼轉漢字
普通字元串可以用多種方式編碼成Unicode字元串,具體要看你究竟選擇了哪種編碼: unicodestring = u"Hello world" # 將Unicode轉化為普通Python字元串:"encode" utf8string = unicodestring.encode("utf-8")
E. 如何理解python3的unicode,以及全形半形轉換
1. unicode是一個編碼的standard,表明了字元與數字之間的映射,是可變長的。
2. 映射後的數據如何編碼為位元組?這個就是具體的編碼規則:目前最主流的是UTF-8,同樣,它也是變字長的。
python3中的str都是unicode的:「The default encoding for Python source code is UTF-8」
python3中的encode:按照encode()括弧中的參數對字元串進行編碼,就是生成bytes。
所以:
In:'中文'.encode('utf-8')
Out:b'\xe4\xb8\xad\xe6\x96\x87'
這里的b就是Byte,\x表示這個x是被轉義的,意思就是0x。又如:
In: 'abc'.encode('utf-8')
Out: b'abc'
上面的b'a'其實表示的是數字97,b'a'的意思就是字元串'a'的binary數字:
[In]:'abc'.encode('utf-8')[0]
[Out]: 97
同時可以把b'\x'進行解碼,即:
In:b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
Out:'中文'
除了encode('utf-8')外,用ord可以獲得單個utf-8字元對應的數字:
In [60]: ord('a')
Out[60]: 97
In [61]: ord('a')#這個是全形的a
Out[61]: 65345
除了decode('utf-8')外,用chr可以獲得數字對應的utf-8字元:
In [62]: chr(97)
Out[62]: 'a'
除了unicode還有別的編碼標准嗎?有啊,比如我國的GBK,別名也叫cp936。
全形和半形之分,是指同樣一個意義的字元,顯示的大小不同.具體來說,全形和半形的編碼是兩個結果:
In [70]: "mn".encode('utf-8')
Out[70]: b'\xef\xbd\x8d\xef\xbd\x8e
[In]:"mn".encode('utf-8')
[Out]:b'mn'
它們有什麼對應關系呢?(引自這里)
轉換說明
全形半形轉換說明
有規律(不含空格):
全形字元unicode編碼從65281~65374 (十六進制 0xFF01 ~ 0xFF5E)
半形字元unicode編碼從33~126 (十六進制 0x21~ 0x7E)
特例:
空格比較特殊,全形為 12288(0x3000),半形為 32(0x20)
除空格外,全形/半形按unicode編碼排序在順序上是對應的(半形 + 0x7e= 全形),所以可以直接通過用+-法來處理非空格數據,對空格單獨處理。
代碼在此基礎上改動一下(將unichr改為chr即可,適應python3),即:
def strQ2B(ustring):
"""全形轉半形"""
rstring = ""
for uchar in ustring:
inside_code=ord(uchar)
if inside_code == 12288: #全形空格直接轉換
inside_code = 32
elif (inside_code >= 65281 and inside_code <= 65374): #全形字元(除空格)根據關系轉化
inside_code -= 65248
rstring += chr(inside_code)
return rstring
In [69]: strQ2B('你好python')
Out[69]: '你好python'
F. 如何使用python 打開unicode的文件
Python核心庫的open函數是按照ascii設計的。但是,現在我們越來越多地要面對Unicode文件。好在python提供了codecs模塊,幫我們解決了這個問題。
codecs模塊的open定義如下
open( filename, mode[, encoding[, errors[, buffering]]])
Open an encoded file using the given mode and return a wrapped version providing transparent encoding/decoding.
其中前兩個參數filename和mode和默認的open相同。第三個參數encoding是關鍵,制定了文件的編碼方式。
對於常用的Unicode有這幾種utf_16、utf_16_le、utf_16_be、utf_8,每一種還有一些可用的別名,具體可以查找python manual。
utf_16、utf_16_le、utf_16_be參數的區別是這樣的。
如果指定了utf_16,python會檢查文件的BOM(Byte Order Mark)來判斷,文件類型到底是utf_16_le、utf_16_be。對於沒有BOM的文件會報錯。
如果我們直接指定了utf_16_le、utf_16_be,python就不檢查BOM了。對於沒有BOM的文件很好用。但是,對於有BOM的文件就要注意,它會把BOM當作第一個字元讀入。
G. python3 pickle中怎麼使用unicode編碼
Python特有編碼
Python還內置一些特有的編碼集。
4.2.4.1 文本編碼
Python提供了下面從字元串到位元組數組的編碼,以及位元組數據到字元串的解碼:
Codec
Aliases
Purpose
idna
Implements RFC 3490, see also encodings.idna. Only errors='strict' is supported.
mbcs
dbcs
Windows only: Encode operand according to the ANSI codepage (CP_ACP)
palmos
Encoding of PalmOS 3.5
punycode
Implements RFC 3492. Stateful codecs are not supported.
raw_unicode_escape
Latin-1 encoding with \uXXXX and \UXXXXXXXX for other code points. Existing backslashes are not escaped in any way. It is used in the Python pickle protocol.
undefined
Raise an exception for all conversions, even empty strings. The error handler is ignored.
unicode_escape
Encoding suitable as the contents of a Unicode literal in ASCII-encoded Python source code, except that quotes are not escaped. Decodes from Latin-1 source code. Beware that Python source code actually uses UTF-8 by default.
unicode_internal
Return the internal representation of the operand. Stateful codecs are not supported.
Deprecated since version 3.3: This representation is obsoleted by PEP 393
4.2.4.2 二進制編碼轉換
Python提供下面的二進制編碼轉換:位元組對象到位元組對象映射轉換,不支持使用bytes.decode()。
Codec
Aliases
Purpose
Encoder / decoder
base64_codec [1]
base64, base_64
Convert operand to MIME base64 (the result always includes a trailing '\n')
Changed in version 3.4: accepts any bytes-like object as input for encoding and decoding
base64.b64encode() / base64.b64decode()
bz2_codec
bz2
Compress the operand using bz2
bz2.compress() / bz2.decompress()
hex_codec
hex
Convert operand to hexadecimal representation, with two digits per byte
base64.b16encode() / base64.b16decode()
quopri_codec
quopri, quotedprintable, quoted_printable
Convert operand to MIME quoted printable
quopri.encodestring() / quopri.decodestring()
uu_codec
uu
Convert the operand using uuencode
uu.encode() / uu.decode()
zlib_codec
zip, zlib
Compress the operand using gzip
zlib.compress() / zlib.decompress()
4.2.4.3 文本編碼轉換
下面編解碼器支持字元串到字元串的轉換:
Codec
Aliases
Purpose
rot_13
rot13
Returns the Caesar-cypher encryption of the operand
4.2.5 encodings.idna--國際化域名的應用
本模塊實現了RFC 3490(Internationalized Domain Names in Applications)和RFC 3492(Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN) 的功能。它實現的功能建立在punycode編碼和stringprep模塊之上。
這兩個RFC定義了非ASCII字元表示域名的規范。如果一個域名含有非ASCII字元,需要把它轉換為ASCII兼容編碼的域名(ACE),因為有一些網路協議不支持非ASCII字元的域名,比如DNS查詢、HTTP主機等等。因此這些轉換工作可以人工轉換,也可以是程序轉換。在程序里轉換,需要把UNICODE的域名轉換為ACE兼容的域名之後,才能進行處理,當要給用戶顯示時需要從ACE反向轉換為UNICODE域名。
Python提供了好幾種方法來做轉換的工作:使用idna編解碼來操作UNICODE與ACE之間相互轉換;把輸入字元串分離成標記,然後通過RFC3490進行查表,再合並成相應的域名;最後一種是把輸入字元串分成標記,通過ACE標記轉換。在socket模塊里,就透明地實現了從UNICODE主機名稱轉換為ACE域名,所以應用程序在調用這個模塊時就不需要考慮UNICODE域名轉換為ACE域名的工作了。基於socket模塊之上的功能,比如http.client和ftplib都可以接受UNICODE域名。
當從網路收到的域名,它是不會自動轉換為 UNICODE域名的,需要應用程序進行轉換之後,才能以UNICODE域名顯示給用戶。
模塊encodings.idna也實現nameprep的處理,它能實現主機名稱的標准化處理,域名的大小寫統一化,如果需要這些功能是可以直接使用。
encodings.idna.nameprep(label)
返回label的國際化標志名稱。
encodings.idna.ToASCII(label)
轉換label為ASCII表示,符合標准RFC 3490。
encodings.idna.ToUnicode(label)
轉換label為UNICODE表示,符合標准RFC 3490.
4.2.6 encodings.mbcs--Windows的ANSI編碼
本模塊實現從ANSI(CP_ACP)代碼進行編碼的功能。僅在Windows系統上可用。
4.2.7 encodings.utf_8_sig-UTF-8帶BOM標記的codec編碼
本模塊實現UTF-8的編碼和解碼:把帶有BOM的UTF-8編碼轉換為不帶BOM的UTF-8編碼。當在生成BOM時,只在第一次時生成;當在解碼時跳過相應的BOM標記位元組,再進行解碼。
H. Python如何將Unicode中文字元串轉換成 string字元串
Unicode字元串可以用多種方式編碼為普通字元串,假設unicodestring = u"Hello world",依照所選擇的編碼(encoding),如下:
1、#將Unicode轉換成普通的Python字元串:"編碼(encode)"。
(8)unicode碼在python里怎麼用擴展閱讀:
Python轉換字元和字元串的原因:為了處理不適合用ASCII字元集表示的數據。
在以ASCII碼為中心的語言和環境中,位元組和字元被當做相同的事物。由於一個位元組只能有256個值,這些環境就受限為只支持256個字元Unicode碼,另一方面,有數萬個字元,那意謂著每個Unicode字元佔用多個位元組,因此,你需要在字元和位元組之間作出區別。
(1)UTF-8編碼能處理任何的Unicode字元。它也是與ASCII碼向後兼容的,因此一個純粹的ASCII碼文件也能被考慮為一個UTF-8文件,而且一個碰巧只使用ASCII碼字元的 UTF-8文件和擁有同樣字元的ASCII碼文件是相同的。
這個特性使得UTF-8的向後兼容性非常好,尤其使用較舊的Unix工具時。UTF-8 無疑地是在 Unix上的占優勢的編碼。它主要的弱點是對東方文字是非常低效的。
(2)UTF-16編碼在微軟的操作系統和java環境下受到偏愛。它對西方語言是比較低效,但對於東方語言是更有效率的。一個UTF-16 的變體有時叫作UCS-2 。
(3)ISO-8859編碼系列是256個字元的ASCII碼的超集。他們不能夠支援所有的Unicode碼字元;他們只能支援一些特別的語言或語言家族。
ISO-8859-1,也既Latin-1,包括大多數的西歐和非洲語言,但是不含阿拉伯語。ISO-8859-2,也既Latin-2,包括許多東歐的語言,像是匈牙利語和波蘭語。
I. Python2.7 中文字元編碼,使用Unicode時,選擇什麼編碼格式
關於編碼和亂碼的問題,我簡單講一下。
通常問這類問題的人是混淆了若干個不同的概念,並且他們自己也沒有意識到自己混淆了這些概念的。
終端顯示字元的編碼(windows下終端是cmd,linux下是各種terminal,遠程登錄是putty或者xshell)
shell環境的編碼。比如中文版windows用的是gbk(向下兼容gb2312),大多數linux發行版使用的是utf-8(LANG=zh_CN.UTF-8)。
文本文件的編碼。這個通常取決於你的編輯器,而且有的編輯器支持多種編碼的話,你可以在文本開頭位置指定編輯器使用特定編碼。比如# -*- coding: utf8 -*-,vim看到這行會默認將這個腳本認定為utf-8兼容編碼格式。
應用程序的內部編碼。一個字元串,作為數據只是一個位元組數組,但是作為字元的數組,就有一個解析方式。java和python的內部字元編碼是utf-16,python和java都支持用不同的編碼來對位元組數組進行decode來得到字元數組。
拿題主的問題來解釋一下。
我在ubuntu kylin中文環境下默認terminal中做了同樣的實驗,但是結果和題主恰好相反:
題主現在弄了一個文件,在開始加上了
# -*- coding: utf8 -*-
這下編輯器看到了,知道這文件是utf-8的了。所以編輯器對讀入的一坨坨位元組用utf-8來解碼,對於輸出到磁碟的漢字也用utf-8來編碼。所以你在文件裡面看到的看上去像「漢字」的東西,就和第一種情況下想同了,當然代碼就跑得通。
順便說一下,如果編輯器無視行首這行編碼聲明,或者編輯器無法支持utf-8格式,那麼你弄好的文件在那個編輯器下就會顯示亂碼,多麼簡單的道理啊。
終端和環境的編碼一致(本機通常是一致的,不一致常常出現在遠程登錄);如果不一致就需要有編輯器或者文本閱讀器做一個兼容兩者的轉換。
編輯器能夠認識文本編碼
系統擁有能顯示這種字元的字體。
這也就是我為什麼一直反對在程序文本中使用除ascii之外的所有編碼字元的原因。環境太復雜了,繞開問題遠比解決問題輕松。
J. python中怎樣將unicode轉換成原來的中文
python默認就是unicode存儲。如果是從文件讀取的,在open的參數中指定encoding關鍵字參數就行。如下:
#coding=utf-8/importjson /defLoadQuestion(): /f=open("test.json",'r') qas=json.load(f) question=qas['documents'] /returnquestion/t=LoadQuestion() /printstr(t).decode("unicode-escape")
通常python2時所有IO讀寫都是byte方式。也就是編碼後的。java也是這樣子。只有python3還有某些特定的模塊才會自動將byte重新轉換成unicode
在python2里的確可以使用s.decode('gbk','ignore')之類的變成unicode。不過在python3里應該是這樣子, s.encode('gbk','ignore')這樣就變成了byte
如果你喜歡 utf-8,可以s.encode(『utf-8','ignore')和s.decode(『utf-8','ignore')