Apa awalan u dalam string Python?

232

Seperti di:

u'Hello'

Dugaan saya adalah ini menunjukkan "Unicode", apakah benar?

Jika demikian, sejak kapan itu tersedia?

OscarRyz
sumber

Jawaban:

147

Anda benar, lihat 3.1.3. String Unicode .

Sudah sintaks sejak Python 2.0.

Python 3 menjadikannya berlebihan, karena tipe string default adalah Unicode. Versi 3.0 hingga 3.2 menghapusnya, tetapi mereka ditambahkan kembali dalam 3,3+ untuk kompatibilitas dengan Python 2 untuk membantu transisi 2 ke 3.

Stefan Kendall
sumber
6
Orang harus menambahkan bahwa itu tidak perlu di Python 3 lagi, tetapi sintaks masih valid.
Martin Thoma
Menggabungkan string unicode + raw (regex) (eg ur"string") valid dalam Python 2, tetapi sayangnya sintaks tidak valid dalam Python 3.
cowlinator
123

Huruf u u'Some String'berarti bahwa string Anda adalah string Unicode .

T: Saya sedang terburu-buru, sangat mengerikan dan saya mendarat di sini dari Google Search. Saya mencoba menulis data ini ke file, saya mendapatkan kesalahan, dan saya perlu yang paling sederhana, mungkin cacat, solusi detik ini.

A: Anda harus benar-benar membaca Joel's Absolute Minimum Setiap Pengembang Perangkat Lunak Sepenuhnya, Positif Harus Tahu Tentang Unicode dan Kumpulan Karakter (Tanpa Alasan!) Pada rangkaian karakter.

T: jangan ada kode waktu, mohon

Denda. coba str('Some String')atau 'Some String'.encode('ascii', 'ignore'). Tapi Anda harus benar-benar membaca beberapa jawaban dan diskusi tentang Konversi string Unicode dan ini sangat baik, sangat baik, primer pada pengkodean karakter.

Andrew
sumber
6
Ini berfungsi jika string hanya berisi teks ASCII . Dalam semua kasus lain, Anda harus menyandikan secara eksplisit.
Martijn Pieters
2
Ini memperlakukan Anda sebagai sesuatu "untuk menyingkirkan". Ini memberitahu saya bahwa Anda sebenarnya tidak mengerti apa itu. Anda umumnya tidak hanya ingin "menyingkirkan" itu, dan cara yang benar untuk membuat string byte dari string Unicode tergantung pada apa yang berisi string itu dan dalam konteks mana.
Lennart Regebro
2
@LennartRegebro benar-benar setuju - ini adalah jawaban kosong yang dimaksudkan sebagai masalah besar, tetapi itu mengumpulkan semacam upvotes yang mengerikan. diedit untuk mencoba mengarahkan orang ke arah yang benar.
Andrew
1
Itu menyenangkan dibaca! Terima kasih! Artikel berumur 17 tahun dan masih akurat. Wow.
Kerwin Sneijders
52

Dugaan saya adalah ini menunjukkan "Unicode", apakah benar?

Iya.

Jika demikian, sejak kapan itu tersedia?

Python 2.x.

Dalam Python 3.x string menggunakan Unicode secara default dan tidak perlu uawalan. Catatan: dalam Python 3.0-3.2, u adalah kesalahan sintaksis. Di Python 3.3+ itu legal lagi untuk membuatnya lebih mudah untuk menulis 2/3 aplikasi yang kompatibel.

kennytm
sumber
4
Ini bahkan merupakan Kesalahan Sintaksis dalam Python 3 untuk menggunakan uawalan.
Tim Pietzcker
14
@TimPietzcker: Hanya di 3.0-3.2; di 3.3+ legal (dan tidak berarti), untuk membuatnya lebih mudah untuk menulis pustaka dan aplikasi basis kode tunggal 2,6 + / 3,3 +.
abarnert
@abarnert: Ya, komentar itu sekarang sudah empat setengah tahun :)
Tim Pietzcker
3
@TimPietzcker: Tentu, tetapi sama seperti komentar Anda adalah tambahan yang berguna bagi siapa pun yang menemukan jawaban yang bermanfaat ini dengan mencari di tahun 2010, saya pikir akan bermanfaat untuk menyebutkan perubahan 3,3 kepada siapa pun yang menemukannya pada tahun 2014. Mungkin bisa lebih baik untuk mengedit jawab, tapi saya pikir ini adalah hal kecil yang tidak akan diketahui oleh kebanyakan orang (karena kecuali Anda masih menggunakan 3.0-3.2 di 2014, "tidak perlu awalan" adalah yang perlu Anda ketahui).
abarnert
Jika Anda menulis kode untuk diunduh dan dijalankan oleh pengguna yang sewenang-wenang, dan ingin menutup kasus yang paling mungkin tanpa membuat asumsi, perlu diketahui bahwa 3.0-3.2 akan rusak. Karena Anda perlu memutuskan apakah Anda ingin menggunakan di six.text_type()mana-mana untuk jumlah (mudah-mudahan sangat kecil) orang yang masih menggunakan 3. [012] - setidaknya informasinya ada sehingga Anda dapat memilih.
dwanderson
3

Saya datang ke sini karena saya memiliki sindrom char-lucu di requestsoutput saya . Saya pikir response.textakan memberi saya string yang diterjemahkan dengan benar, tetapi dalam output saya menemukan double-chars lucu di mana umlaut Jerman seharusnya.

Ternyata response.encodingentah bagaimana kosong dan jadi responsetidak tahu bagaimana cara mendekode konten dengan benar dan hanya memperlakukannya sebagai ASCII (saya kira).

Solusi saya adalah mendapatkan byte mentah dengan 'response.content' dan secara manual berlaku decode('utf_8')untuk itu. Hasilnya adalah schöne Umlaute.

Yang diterjemahkan dengan benar

bulu

vs yang tidak benar diterjemahkan

untuk

Chris
sumber
2

Semua string yang dimaksudkan untuk manusia harus menggunakan u "".

Saya menemukan bahwa pola pikir berikut sangat membantu ketika berhadapan dengan string Python: Semua string manifest Python harus menggunakan u""sintaksis. The ""sintaks untuk array byte, hanya.

Sebelum pesta dimulai, izinkan saya menjelaskan. Sebagian besar program Python dimulai dengan menggunakan ""untuk string. Tetapi kemudian mereka perlu mendukung dokumentasi dari Internet, sehingga mereka mulai menggunakan "".decodedan tiba-tiba mereka mendapatkan pengecualian di mana-mana tentang mendekode ini dan itu - semua karena penggunaan ""string. Dalam hal ini, Unicode bertindak seperti virus dan akan mendatangkan malapetaka.

Tetapi, jika Anda mengikuti aturan saya, Anda tidak akan mengalami infeksi ini (karena Anda sudah terinfeksi).

Frank Krueger
sumber
bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm
@ KennyTM Kedengarannya bagus! Dimaksudkan untuk mengatakan semua string yang dimaksudkan untuk manusia harus digunakan u"".
Frank Krueger
1
Jika Anda ingin menggunakan Unicode secara religius di mana-mana — yang, untuk banyak aplikasi (tetapi tidak semua), adalah hal yang baik — Anda hampir pasti menginginkan Python 3.x, bukan 2.x. Itu mungkin tidak benar pada 2010 ketika ini ditulis, tetapi pada 2014, sebagian besar pustaka atau platform yang mencegah Anda meningkatkan ke 3.x juga akan mencegah Anda menggunakan Unicode dengan benar ...
abarnert
1

Ini Unicode.

Letakkan saja variabel di antara str(), dan itu akan berfungsi dengan baik.

Tetapi jika Anda memiliki dua daftar seperti berikut:

a = ['co32','co36']
b = [u'co32',u'co36']

Jika Anda memeriksa set(a)==set(b), itu akan menjadi False, tetapi jika Anda lakukan sebagai berikut:

b = str(b)
set(a)==set(b)

Sekarang, hasilnya akan Benar.

pengguna3251882
sumber
Bahaya, bahaya. Anda tidak boleh menyandikan Unicode ( str()atau u'€'.encode()) tanpa melewati penyandian. Jika string berisi non-ASCII, pengguna akan menerima UnicodeEncodeException.
Alastair McCormack
3
Selanjutnya, kode Anda tidak berfungsi. b = str(b)hanya memberikan string repr()daftar, yaitu b = "[u'co32', u'co36']". Kemudianset(a)==set(b) = False
Alastair McCormack