Python dizesindeki u öneki nedir?


232

Gibi:

u'Hello'

Benim tahminim "Unicode" u gösteriyor, doğru mu?

Eğer öyleyse, ne zaman kullanılabilir?

Yanıtlar:


147

Haklısın, bakınız 3.1.3. Unicode Dizeleri .

Python 2.0'dan beri sözdizimi oldu.

Python 3, varsayılan dize türü Unicode olduğu için bunları gereksiz hale getirdi. 3.0 ile 3.2 arasındaki sürümler kaldırıldı, ancak 2-3 geçişte Python 2 ile uyumluluk için yeniden eklendi .


6
Python 3'te artık gerekli olmadığını, ancak yine de geçerli sözdizimini eklemeliyiz.
Martin Thoma

Unicode + raw (regex) dizelerini (örn. ur"string") Birleştirmek Python 2'de geçerlidir, ancak ne yazık ki Python 3'te geçersiz sözdizimi
cowlinator

123

U u'Some String'ifadesi, dizenizin bir Unicode dizesi olduğu anlamına gelir .

S: Çok korkunç ve acelem var ve buraya Google Arama'dan geldim. Bu verileri bir dosyaya yazmaya çalışıyorum, bir hata alıyorum ve bu saniye ölü en basit, muhtemelen, çözüme ihtiyacım var.

C: Joel'in Mutlak Minimum Her Yazılım Geliştiricisini karakter kümeleri üzerinde Unicode ve Karakter Kümeleri (Bahane Yok!) Makalesini Kesinlikle, Olumlu Olarak Bilmeniz Gerekiyor .

Q: sry hiçbir zaman kodu pls

Bir ceza. denemek str('Some String')veya 'Some String'.encode('ascii', 'ignore'). Ancak , Unicode dizesini dönüştürme ile ilgili bazı cevapları ve tartışmaları ve karakter kodlamayla ilgili bu mükemmel, mükemmel, primeri gerçekten okumalısınız .


6
Bu, dize yalnızca ASCII metni içeriyorsa çalışır . Diğer tüm durumlarda açıkça kodlamanız gerekir.
Martijn Pieters

2
Bu, u '' yı "kurtulmak için" bir şey olarak görür. Bu bana gerçekte ne olduğunu anlamadığını söyler. Genellikle yalnızca "kurtulmak" istemezsiniz ve bir Unicode dizesinden bir bayt dizesi oluşturmanın doğru yolu, dizenin içeriğine ve hangi bağlamda olduğuna bağlıdır.
Lennart Regebro

2
@LennartRegebro tamamen kabul etti - bu yanakta dil olması gereken bir ıskarta cevaptı, ancak bir tür korkunç sayıda upvotes biriktirdi. millet doğru yönde yönlendirmek için düzenlendi.
Andrew

1
Bu eğlenceli bir okumaydı! Teşekkürler! Makale 17 yaşında ve hala doğru. Vay.
Kerwin Sneijders

52

Benim tahminim "Unicode" u gösteriyor, doğru mu?

Evet.

Eğer öyleyse, ne zaman kullanılabilir?

Python 2.x.

Python 3.x'de dizeler varsayılan olarak Unicode kullanır ve uön eke gerek yoktur . Not: Python 3.0-3.2'de u bir sözdizimi hatasıdır. Python 3.3+ sürümünde 2/3 uyumlu uygulama yazmayı kolaylaştırmak yine yasaldır.


4
uÖneki kullanmak Python 3'te bir Sözdizimi Hatası bile .
Tim Pietzcker

14
@TimPietzcker: Yalnızca 3.0-3.2'de; 3.3 + 'da 2.6 + / 3.3 + tek kodlu kütüphane ve uygulamalar yazmayı kolaylaştırmak yasaldır (ve anlamsızdır).
abarnert

@abarnert: Bu yorum şu anda dört buçuk yaşında :)
Tim Pietzcker

3
@TimPietzcker: Tabii, ancak yorumunuz 2010'da arama yaparak bu yararlı yanıtı bulan herkes için yararlı bir ek olarak, 2014'te bulan herkese 3.3'teki değişiklikten bahsetmenin yararlı olduğunu düşünüyorum. cevap, ancak çoğu insanın karşılaşmayacağı küçük bir nokta olduğunu düşünüyorum (çünkü 2014'te 3.0-3.2'yi hala kullanmıyorsanız, "öneki gerekmiyor" bilmeniz gereken tek şey).
abarnert

Rasgele kullanıcıların indirmesi ve çalıştırması için kod yazıyorsanız ve varsayımlar yapmadan en olası durumları kapsamak istiyorsanız, 3.0-3.2'nin kesileceğini bilmek yararlı olacaktır. Çünkü six.text_type()hala 3 kullanan (umarım küçük) sayıda kişi için her yerde kullanmayı düşünüp düşünmeyeceğinize karar vermeniz gerekir . [012] - en azından bilgi orada, böylece seçim yapabilirsiniz.
dwanderson

3

Buraya geldim çünkü çıktımda komik-char-sendromu vardı requests. response.textBana düzgün bir şekilde çözülmüş bir dize vereceğini düşündüm , ancak çıktıda Alman umlautlarının olması gereken komik çift karakterleri buldum.

Görünen response.encodingo responseki bir şekilde boştu ve bu yüzden içeriğin düzgün bir şekilde nasıl çözüleceğini ve sadece ASCII olarak ele alındığını bilmiyordum (sanırım).

Benim çözümüm ham baytları 'response.content' ile almak ve el ile uygulamaktı decode('utf_8'). Sonuç schöne Umlaute oldu.

Doğru kod çözme

kürk

uygun şekilde kodu çözülmemiş

fĂźr


2

İnsanlara yönelik tüm teller u "" kullanmalıdır.

Aşağıdaki zihniyetin Python dizeleri ile uğraşırken çok yardımcı olduğunu gördüm: Tüm Python manifest dizeleri u""sözdizimini kullanmalıdır . ""Sözdizimi sadece, bayt dizileri içindir.

Dayak başlamadan önce açıklayayım. Çoğu Python programı ""dizeler için kullanmaya başlar . Ama sonra internetten belgeleri desteklemeleri gerekiyor, bu yüzden kullanmaya başlıyorlar "".decodeve aniden bu ve bunun kodunu çözme konusunda her yerde istisnalar alıyorlar - hepsi"" dizelerin . Bu durumda, Unicode bir virüs gibi davranır ve tahribat yaratır.

Ancak, kuralımı takip ederseniz, bu enfeksiyona sahip olmayacaksınız (çünkü zaten enfekte olacaksınız).


bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm

@KennyTM Kulağa hoş geliyor! Basitçe, insanlar için kullanılan tüm dizelerin kullanması gerektiğini söylemek istedim u"".
Frank Krueger

1
Dini olarak Unicode'u her yerde kullanmak istiyorsanız - ki bu, birçok uygulama için (hepsi değil) iyi bir şeydir - neredeyse kesinlikle 2.x değil Python 3.x'i istersiniz. Bu yazı yazıldığı 2010'da doğru olmayabilir, ancak 2014'te
3.x'e

1

Unicode.

Değişkeni arasına koymanız yeterli str()olacaktır.

Ancak aşağıdaki gibi iki listeniz olması durumunda:

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

Kontrol ederseniz set(a)==set(b), Yanlış olarak gelir, ancak aşağıdaki gibi yaparsanız:

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

Şimdi, sonuç Doğru olacaktır.


Tehlike, tehlike. Bir Unicode ( str()veya u'€'.encode()) kodlamasından geçmeden asla kodlanmamalısınız . Dize ASCII dışı içeriyorsa, kullanıcı bir UnicodeEncodeException alır.
Alastair McCormack

3
Ayrıca, kodunuz çalışmıyor. listenin b = str(b)dizesini verir repr(), yani b = "[u'co32', u'co36']". Sonraset(a)==set(b) = False
Alastair McCormack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.