Jaki jest prefiks u w ciągu Python?


232

Jak w:

u'Hello'

Domyślam się, że wskazuje „Unicode”, czy to prawda?

Jeśli tak, to od kiedy jest dostępny?

Odpowiedzi:


147

Masz rację, patrz 3.1.3. Ciągi znaków Unicode .

Jest to składnia od Python 2.0.

Python 3 sprawił, że stały się one zbędne, ponieważ domyślnym typem ciągu jest Unicode. Wersje od 3.0 do 3.2 usunęły je, ale zostały one ponownie dodane w wersji 3.3+ w celu zapewnienia zgodności z Python 2, aby wspomóc przejście z wersji 2 na 3.


6
Należy dodać, że w Pythonie 3 nie jest to już konieczne, ale nadal obowiązuje składnia.
Martin Thoma

Łączenie ciągów znaków Unicode + raw (regex) (np. ur"string") Jest poprawne w Pythonie 2, ale niestety jest to nieprawidłowa składnia w Pythonie 3.
cowlinator

123

U u'Some String'oznacza, że ​​Twój ciąg jest ciągiem Unicode .

P: Bardzo mi się spieszy i wylądowałem tutaj z wyszukiwarki Google. Próbuję zapisać te dane do pliku, pojawia się błąd i potrzebuję najprostszego, prawdopodobnie wadliwego, rozwiązania w tym momencie.

Odp .: Naprawdę powinieneś przeczytać absolutnie minimum Joela Każdy programista absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków (bez wymówek!) Na temat zestawów znaków.

P: Sry no time code pls

Mandat. spróbuj str('Some String')lub 'Some String'.encode('ascii', 'ignore'). Ale naprawdę powinieneś przeczytać niektóre odpowiedzi i dyskusje na temat Konwertowania łańcucha Unicode i tego doskonałego, doskonałego elementu do kodowania znaków .


6
Działa to, jeśli ciąg zawiera tylko tekst ASCII . We wszystkich innych przypadkach musisz jawnie zakodować.
Martijn Pieters

2
To traktuje użytkownika jako „coś, czego można się pozbyć”. To mówi mi, że tak naprawdę nie rozumiesz, co to jest. Zasadniczo nie chcesz go po prostu „pozbyć”, a poprawny sposób utworzenia ciągu bajtowego z ciągu Unicode zależy od tego, co zawiera i w jakim kontekście.
Lennart Regebro,

2
@LennartRegebro całkowicie się zgodził - była to krótka odpowiedź, która miała być zuchwała, ale zgromadziła coś w rodzaju przerażającej liczby entuzjastów. edytowane, aby próbować kierować ludźmi we właściwym kierunku.
Andrew

1
To była fajna lektura! Dzięki! Artykuł ma 17 lat i nadal jest dokładny. Łał.
Kerwin Sneijders

52

Domyślam się, że wskazuje „Unicode”, czy to prawda?

Tak.

Jeśli tak, to od kiedy jest dostępny?

Python 2.x.

W Pythonie 3.x ciągi domyślnie używają Unicode i nie ma potrzeby używania uprefiksu. Uwaga: w Python 3.0-3.2 u jest błędem składni. W Pythonie 3.3+ znów legalne jest ułatwianie pisania aplikacji zgodnych z 2/3.


4
Używanie uprzedrostka w Pythonie 3 jest nawet błędem składni .
Tim Pietzcker,

14
@TimPietzcker: tylko w 3.0-3.2; w wersji 3.3+ jest to legalne (i bez znaczenia), aby ułatwić pisanie bibliotek i aplikacji z jednym kodem 2.6 + / 3.3 +.
abarnert

@abarnert: Cóż, ten komentarz ma teraz cztery i pół roku :)
Tim Pietzcker

3
@TimPietzcker: Jasne, ale tak jak twój komentarz był przydatnym dodatkiem dla każdego, kto znalazł tę przydatną odpowiedź przez wyszukiwanie w 2010 roku, myślę, że warto wspomnieć o zmianie 3.3 wszystkim, którzy ją znajdą w 2014 roku. Być może lepiej jest edytować odpowiedź, ale myślę, że jest to drobna kwestia, na którą większość ludzi nie wpadnie (bo chyba, że ​​nadal będziesz używać wersji 3.0-3.2 w 2014 roku, „nie potrzebujesz prefiksu” to wszystko, co musisz wiedzieć).
abarnert

Jeśli piszesz kod do pobrania i uruchomienia dla dowolnych użytkowników i chcesz objąć jak najwięcej przypadków bez przyjmowania założeń, dobrze jest wiedzieć, że 3.0-3.2 się zepsuje. Ponieważ musisz zdecydować, czy chcesz używać six.text_type()wszędzie dla (miejmy nadzieję, niewielkiej liczby) osób nadal używających 3. [012] - przynajmniej informacje są dostępne, więc możesz wybrać.
dwanderson

3

Przybyłem tutaj, ponieważ miałem na sobie syndrom Funny Char requests. myślałemresponse.text że da mi poprawnie zdekodowany ciąg, ale w wyjściu znalazłem zabawne podwójne znaki, gdzie powinny być niemieckie umlauty.

Okazało się, że response.encodingbył jakoś pustyresponse nie wiedziałem, jak poprawnie odkodować zawartość, i po prostu potraktowałem ją jako ASCII (tak myślę).

Moim rozwiązaniem było uzyskanie surowych bajtów za pomocą „response.content” i ręczne zastosowanie decode('utf_8')do nich. Rezultatem był schöne Umlaute.

Prawidłowo zdekodowany

futro

kontra niewłaściwie zdekodowane

f


2

Wszystkie ciągi przeznaczone dla ludzi powinny używać „”.

Odkryłem, że następujący sposób myślenia bardzo pomaga w radzeniu sobie z ciągami znaków w języku Python: Wszystkie ciągi znaków w języku Python powinny korzystać ze u""składni. The""Składni dla tablic bajtowych tylko.

Zanim zacznie się walenie, pozwól mi wyjaśnić. Większość programów w języku Python zaczyna się od używania ""ciągów. Ale potem muszą obsługiwać dokumentację przez Internet, więc zaczynają używać "".decodei nagle wszędzie pojawiają się wyjątki dotyczące dekodowania tego i tamtego - wszystko z powodu użycia"" ciągów. W takim przypadku Unicode działa jak wirus i powoduje spustoszenie.

Ale jeśli zastosujesz się do mojej zasady, nie będziesz mieć tej infekcji (ponieważ będziesz już zainfekowany).


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

@KennyTM Brzmi dobrze! Mówiąc po prostu, że wszystkie ciągi przeznaczone dla ludzi powinny używać u"".
Frank Krueger,

1
Jeśli chcesz religijnie używać Unicode wszędzie - co dla wielu aplikacji (ale nie wszystkich) jest dobrą rzeczą - prawie na pewno chcesz Python 3.x, a nie 2.x. Być może nie było to prawdą w 2010 r., Kiedy to zostało napisane, ale w 2014 r. Większość bibliotek lub platform, które uniemożliwiają aktualizację do wersji 3.x, również uniemożliwi prawidłowe korzystanie z Unicode…
abarnert

1

To jest Unicode.

Po prostu wstaw zmienną pomiędzy str() , a będzie działać dobrze.

Ale w przypadku, gdy masz dwie takie listy:

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

Jeśli sprawdzisz set(a)==set(b), pojawi się on jako False, ale jeśli wykonasz następujące czynności:

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

Teraz wynik będzie prawdziwy.


Niebezpieczeństwo, niebezpieczeństwo. Nigdy nie należy kodować Unicode ( str()lub u'€'.encode()) bez przekazania kodowania. Jeśli ciąg zawiera znaki inne niż ASCII, użytkownik otrzyma wyjątek UnicodeEncodeException.
Alastair McCormack,

3
Co więcej, twój kod nie działa. b = str(b)po prostu podaje ciąg repr()listy, tj b = "[u'co32', u'co36']". Następnieset(a)==set(b) = False
Alastair McCormack,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.