Python Language
Unicode och byte
Sök…
Syntax
- str.encode (kodning, fel = 'strikt')
- bytes.decode (kodning, fel = 'strikt')
- öppen (filnamn, läge, kodning = inget)
parametrar
Parameter | detaljer |
---|---|
kodning | Kodningen att använda, t.ex. 'ascii' , 'utf8' , etc ... |
fel | Felläget, t.ex. 'replace' att ersätta dåliga tecken med frågetecken, 'ignore' att ignorera dåliga tecken, etc. ... |
Grunderna
I Python 3 str
är typen för unicode-aktiverade strängar, medan bytes
är typen för sekvenser av råbyte.
type("f") == type(u"f") # True, <class 'str'>
type(b"f") # <class 'bytes'>
I Python 2 var en tillfällig sträng en sekvens av råbyte som standard och unicodsträngen var varje sträng med "u" -prefix.
type("f") == type(b"f") # True, <type 'str'>
type(u"f") # <type 'unicode'>
Unicode till byte
Unicode-strängar kan konverteras till byte med .encode(encoding)
.
Python 3
>>> "£13.55".encode('utf8')
b'\xc2\xa313.55'
>>> "£13.55".encode('utf16')
b'\xff\xfe\xa3\x001\x003\x00.\x005\x005\x00'
Python 2
i py2 är standardkonsolens kodning sys.getdefaultencoding() == 'ascii'
och inte utf-8
som i py3, därför är det inte direkt möjligt att skriva ut det som i föregående exempel.
>>> print type(u"£13.55".encode('utf8'))
<type 'str'>
>>> print u"£13.55".encode('utf8')
SyntaxError: Non-ASCII character '\xc2' in...
# with encoding set inside a file
# -*- coding: utf-8 -*-
>>> print u"£13.55".encode('utf8')
£13.55
Om kodningen inte kan hantera strängen höjs en "UnicodeEncodeError":
>>> "£13.55".encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 0: ordinal not in range(128)
Bytes till unicode
Bytes kan konverteras till unicode-strängar med .decode(encoding)
.
En sekvens av byte kan endast konverteras till en unicode-sträng via lämplig kodning!
>>> b'\xc2\xa313.55'.decode('utf8')
'£13.55'
Om kodningen inte kan hantera strängen UnicodeDecodeError
en UnicodeDecodeError
:
>>> b'\xc2\xa313.55'.decode('utf16')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/csaftoiu/csaftoiu-github/yahoo-groups-backup/.virtualenv/bin/../lib/python3.5/encodings/utf_16.py", line 16, in decode
return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x35 in position 6: truncated data
Felhantering för kodning / avkodning
.encode
och .decode
båda .decode
.
Standardvärdet är 'strict'
, vilket gör undantag vid fel. Andra lägen är mer förlåtande.
kodning
>>> "£13.55".encode('ascii', errors='replace')
b'?13.55'
>>> "£13.55".encode('ascii', errors='ignore')
b'13.55'
>>> "£13.55".encode('ascii', errors='namereplace')
b'\\N{POUND SIGN}13.55'
>>> "£13.55".encode('ascii', errors='xmlcharrefreplace')
b'£13.55'
>>> "£13.55".encode('ascii', errors='backslashreplace')
b'\\xa313.55'
avkodning
>>> b = "£13.55".encode('utf8')
>>> b.decode('ascii', errors='replace')
'��13.55'
>>> b.decode('ascii', errors='ignore')
'13.55'
>>> b.decode('ascii', errors='backslashreplace')
'\\xc2\\xa313.55'
Moral
Det framgår av ovanstående att det är viktigt att hålla dina kodningar raka när du handlar med unicode och byte.
Fil I / O
Filer som öppnas i ett icke-binärt läge (t.ex. 'r'
eller 'w'
) handlar om strängar. Dövkodkodningen är 'utf8'
.
open(fn, mode='r') # opens file for reading in utf8
open(fn, mode='r', encoding='utf16') # opens file for reading utf16
# ERROR: cannot write bytes when a string is expected:
open("foo.txt", "w").write(b"foo")
Filer som öppnas i binärt läge (t.ex. 'rb'
eller 'wb'
) handlar om byte. Inget kodningsargument kan anges eftersom det inte finns någon kodning.
open(fn, mode='wb') # open file for writing bytes
# ERROR: cannot write string when bytes is expected:
open(fn, mode='wb').write("hi")