Tidak, argumennya tidak sama panjangnya:
>>> len("0123456789")
10
>>> len("₀₁₂₃₄₅₆₇₈₉")
30
Anda mencoba meneruskan data yang dikodekan; Saya menggunakan UTF-8 di sini, di mana setiap digit dikodekan menjadi masing-masing 3 byte.
Anda tidak dapat menggunakan str.translate()
untuk memetakan byte ASCII ke urutan byte UTF-8. Dekode string Anda menjadi unicode
dan gunakan metode unicode.translate()
yang sedikit berbeda; dibutuhkan kamus sebagai gantinya:
nummap = {ord(c): ord(t) for c, t in zip(u"0123456789", u"₀₁₂₃₄₅₆₇₈₉")}
Ini akan membuat kamus yang memetakan titik kode Unicode (bilangan bulat), yang kemudian dapat Anda gunakan pada string Unicode:
>>> nummap = {ord(c): ord(t) for c, t in zip(u"0123456789", u"₀₁₂₃₄₅₆₇₈₉")}
>>> u'99 bottles of beer on the wall'.translate(nummap)
u'\u2089\u2089 bottles of beer on the wall'
>>> print u'99 bottles of beer on the wall'.translate(nummap)
₉₉ bottles of beer on the wall
Anda kemudian dapat mengkodekan output ke UTF-8 lagi jika diinginkan.
Dari dokumentasi metode:
Untuk objek Unicode, metode translate()
tidak menerima argumen opsional deletechars. Sebaliknya, ia mengembalikan salinan s yang semua karakternya telah dipetakan melalui tabel terjemahan tertentu yang harus berupa pemetaan ordinal Unicode ke ordinal Unicode, string Unicode, atau None
. Karakter yang belum dipetakan tidak akan tersentuh. Karakter yang dipetakan ke None
dihapus.
person
Martijn Pieters
schedule
07.05.2015