Inleiding
In dit artikel bekijken we hoe je Bytes omzet naar een String in Python. Aan het eind van dit artikel zul je een duidelijk idee hebben van wat deze types zijn en hoe je er effectief gegevens mee kunt verwerken.
Afhankelijk van de versie van Python die je gebruikt, zal deze taak verschillen. Hoewel Python 2 het einde van zijn leven heeft bereikt, gebruiken veel projecten het nog steeds, dus we zullen zowel de Python 2 als Python 3 aanpak behandelen.
Bytes omzetten naar String in Python 3
Sinds Python 3 moest de oude ASCII manier om dingen te doen verdwijnen, en Python werd volledig Unicode.
Dit betekent dat we het expliciete unicode type kwijt zijn: u"string"
– elke string is een u"string"
!
Om deze strings te onderscheiden van de goede oude bytestrings, maken we kennis met een nieuwe specificatie voor hen – de b"string"
.
Deze werd toegevoegd in Python 2.6, maar het diende geen echt doel, behalve om je voor te bereiden op Python 3, aangezien alle strings bytestrings waren in 2.6.
Bytestrings worden in Python 3 officieel bytes
genoemd, een onveranderlijke reeks gehele getallen in het bereik 0 <= x < 256. Een ander bytes
-achtig object dat in 2.6 is toegevoegd is de bytearray
– vergelijkbaar met bytes
, maar muteerbaar.
Bytes naar String converteren met decode()
Laten we eens kijken hoe we bytes naar een String kunnen converteren, met behulp van de ingebouwde decode()
methode voor de bytes
klasse:
Door het coderingsformaat in te voeren, hebben we het bytes
object gedecodeerd in een string en deze afgedrukt.
Bytes naar String converteren met codecs
Als alternatief kunnen we ook de ingebouwde codecs
module voor dit doel gebruiken:
>>> import codecs>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> codecs.decode(b, 'UTF-8')"Let's grab a 🍕!"
Het is niet echt nodig om de encoderingsparameter door te geven, maar het wordt wel aangeraden om het door te geven:
>>> codecs.decode(b)"Let's grab a 🍕!"
Bytes omzetten naar String met str()
Ten slotte kunt u de str()
functie gebruiken, die verschillende waarden accepteert en ze omzet in strings:
>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> str(b, 'UTF-8')"Let's grab a 🍕!"
Zorg er wel voor dat u het encoding argument meegeeft aan str()
, anders zou u wel eens onverwachte resultaten kunnen krijgen:
>>> str(b)b'Lets grab a \xf0\x9f\x8d\x95!'
Dit brengt ons weer bij de encodings. Als je de verkeerde encoding specificeert, is het beste geval dat je programma crasht omdat het de data niet kan decoderen. Als we bijvoorbeeld de str()
functie zouden gebruiken met UTF-16
, zouden we begroet worden met:
>>> str(b, 'UTF-16')'敌❴\u2073牧扡愠\uf020趟↕'
Dit is des te belangrijker omdat Python 3 graag uitgaat van Unicode – dus als je werkt met bestanden of gegevensbronnen die een obscure codering gebruiken, moet je extra goed opletten.
Bytes omzetten naar String in Python 2
In Python 2 zijn een bundel bytes en een string praktisch hetzelfde – strings zijn objecten die bestaan uit 1-byte lange karakters, wat betekent dat elk karakter 256 waarden kan opslaan. Daarom worden ze ook wel bytestrings genoemd.
Dit is geweldig als je met byte-gegevens werkt – we laden ze gewoon in een variabele en we zijn klaar om af te drukken:
>>> s = "Hello world!">>> s'Hello world!'>>> len(s)12
Het gebruik van Unicode-tekens in bytestrings verandert dit gedrag echter wel een beetje:
>>> s = "Let's grab a 🍕!">>> s'Lets grab a \xf0\x9f\x8d\x95!'# Where has the pizza gone to?>>> len(s)17# Shouldn't that be 15?
Bytes omzetten naar Unicode (Python 2)
Hier moeten we Python 2’s Unicode
type gebruiken, dat in Python 3 wordt verondersteld en automatisch wordt gebruikt. Dit slaat strings op als een serie codepunten, in plaats van bytes.
De \xf0\x9f\x8d\x95
representeert bytes als twee-cijferige hex getallen, omdat Python niet weet hoe deze als ASCII karakters te representeren:
>>> u = u"Let's grab a 🍕!"u"Let's grab a \U0001f355!"">>> u"Let's grab a 🍕!"# Yum.>>> len(u)15
Zoals u hierboven kunt zien, bevat de Unicode string \U0001f355
– een Unicode ge-escaped karakter dat onze terminal nu weet uit te printen als een stuk pizza! Dit instellen was zo eenvoudig als het gebruik van de u
specifier voor de waarde van de bytestring.
Dus, hoe schakel ik tussen de twee?
Je kunt de Unicode string krijgen door je bytestring te decoderen. Dit kan worden gedaan door een Unicode-object te construeren, waarbij de bytestring en een string met de coderingsnaam als argumenten worden opgegeven, of door .decode(encoding)
op een bytestring aan te roepen.
Bytes naar tekenreeks converteren met decode() (Python 2)
U kunt ook de codecs.encode(s, encoding)
uit de codecs
module gebruiken.
>>> s = "Let's grab a \xf0\x9f\x8d\x95!">>> u = unicode(s, 'UTF-8')>>> u"Let's grab a 🍕!">>> s.decode('UTF-8')"Let's grab a 🍕!"
Bytes naar String converteren met codecs (Python 2)
Of met de codecs
module:
import codecs>>> codecs.decode(s, 'UTF-8')"Let's grab a 🍕!"
Geef aandacht aan uw codering
Een woord van voorzichtigheid hier – bytes kunnen verschillend worden geïnterpreteerd in verschillende coderingen. Met zo’n 80 verschillende coderingen beschikbaar uit de doos, is het misschien niet eenvoudig om te weten of je de juiste hebt!
Het oorspronkelijke bericht was ofwel øç
of јч
, en beide lijken geldige conversies te zijn.
Conclusie
Als programmeurs moeten we voortdurend over sommige dingen nadenken en ons er actief op voorbereiden om valkuilen te vermijden. Dit geldt vooral voor de lagere niveaus, waar we zelden komen als we een high-level taal als Python gebruiken als onze dagelijkse chauffeur.
Dingen als charsets, coderingen en binair zijn er om ons eraan te herinneren dat het onze taak is om te coderen – om onze gedachten te coderen in werkende oplossingen. Gelukkig wordt veel van dit denken een deel van onze routine na een paar rondjes achter het toetsenbord.
In dit artikel hebben we besproken hoe je bytes omzet in Strings in Python.