Sumber utama masalah yang saya alami saat bekerja dengan string unicode adalah saat Anda mencampur string yang dikodekan utf-8 dengan yang unicode.
Misalnya, perhatikan skrip berikut.
two.py
# encoding: utf-8
name = 'helló wörld from two'
one.py
# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name + two.name
Output dari menjalankan python one.py
adalah:
Traceback (most recent call last):
File "one.py", line 5, in <module>
print name + two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
Dalam contoh ini, two.name
adalah string yang dienkode utf-8 (bukan unicode) karena tidak diimpor unicode_literals
, dan one.name
merupakan string unicode. Saat Anda mencampur keduanya, python mencoba mendekode string yang dikodekan (dengan asumsi itu ascii) dan mengubahnya menjadi unicode dan gagal. Ini akan berhasil jika Anda melakukannya print name + two.name.decode('utf-8')
.
Hal yang sama dapat terjadi jika Anda menyandikan string dan mencoba mencampurnya nanti. Misalnya, ini berfungsi:
# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
Keluaran:
DEBUG: <html><body>helló wörld</body></html>
Tetapi setelah menambahkan import unicode_literals
itu TIDAK:
# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
Keluaran:
Traceback (most recent call last):
File "test.py", line 6, in <module>
print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)
Gagal karena 'DEBUG: %s'
merupakan string unicode dan oleh karena itu python mencoba memecahkan kode html
. Beberapa cara untuk memperbaiki hasil cetak adalah melakukan print str('DEBUG: %s') % html
atau print 'DEBUG: %s' % html.decode('utf-8')
.
Saya harap ini membantu Anda memahami potensi gotcha saat menggunakan string unicode.
decode()
solusi daripada solusistr()
atauencode()
: semakin sering Anda menggunakan objek Unicode, semakin jelas kodenya, karena yang Anda inginkan adalah memanipulasi string karakter, bukan array byte dengan pengkodean yang tersirat secara eksternal.