Pertanyaan Daftar string unicode


Jika saya memiliki daftar string unicode

lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ]

apakah perlu menulis awalan u sebelum setiap string? Dapatkah saya membuat konstruksi yang mengatakan bahwa setiap elemen LST akan menjadi string unicode dan kemudian menulisnya tanpa u awalan?


5
2018-02-01 14:24


asal


Jawaban:


Dalam Python 2.7 (juga Python 2.6) Anda dapat membuat literal unicode sebagai default untuk sebuah modul:

from __future__ import unicode_literals

Anda harus menyertakan impor di bagian atas file, dan kemudian berlaku untuk semua literal string dalam file. Gunakan b awalan untuk memaksa string byte:

>>> from __future__ import unicode_literals
>>> "sss"
u'sss'
>>> b"x"
'x'

14
2018-02-01 14:43



Jika tujuan Anda adalah mengonversi satu set string standar ke unicode, Anda bisa memetakan fungsi itu ke daftar Anda:

lst = ["aaa", "bbb", "ccc"]
map(unicode, lst)

Pemberian yang mana

[u"aaa", u"bbb", u"ccc"]

Namun jika lst berisi string karakter ASCII non, Anda harus awalan string tertentu dengan u. Jika tidak, Anda akan mendapatkan kesalahan ini pada konversi:

lst = ["\xe4"]
map(unicode,lst)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Seperti tercantum dalam komentar, jawaban ini berbeda untuk Python 2.x atau 3.x. Dengan Python 3, semua berubah:

Segala sesuatu yang Anda pikir Anda ketahui tentang data biner dan Unicode telah berubah. Python 3.0 menggunakan konsep teks dan (binary) data, bukan string Unicode dan string 8-bit. Semua teks adalah Unicode; Namun Unicode dikodekan diwakili sebagai data biner. Jenis yang digunakan untuk menahan teks adalah str, tipe yang digunakan untuk menyimpan data adalah byte. Perbedaan terbesar dengan situasi 2.x adalah bahwa setiap upaya untuk mencampur teks dan data dalam Python 3.0 menimbulkan TypeError, sedangkan jika Anda mencampur Unicode dan string 8-bit dengan Python 2.x, itu akan bekerja jika 8-bit string kebetulan mengandung hanya 7-bit (ASCII) byte, tetapi Anda akan mendapatkan UnicodeDecodeError jika berisi nilai-nilai non-ASCII. Perilaku spesifik-nilai ini telah menyebabkan banyak wajah sedih selama bertahun-tahun.


1
2018-02-01 14:31