Unicode vs UTF-8 forvirring i Python / Django?

stemmer
28

Jeg snublet over denne passasjen i Django opplæringen :

Django modeller har en standard str () metode som innebærer unicodeverdien () og omformer resultatet til et UTF-8 bytestring. Dette betyr at unicodeverdien (p) vil returnere et Unicode streng, og str (p) vil returnere en vanlig snor, med tegn som er kodet som UTF-8.

Nå er jeg forvirret fordi AFAIK Unicode er ikke noen spesiell representasjon, så hva er en Unicode-streng i Python? Betyr det at UCS-2? Googling slått opp denne Python Unicode Tutorial som frimodig sier

Unicode er en to-byte koding som dekker alle verdens vanligste skriftsystemer.

som er vanlig feil, eller er det? Jeg har blitt forvirret mange ganger av tegnsett og koding problemer, men her er jeg helt sikker på at dokumentasjonen jeg leser er forvirret. Er det noen som vet hva som skjer i Python da det gir meg en Unicode-streng?

Publisert på 22/08/2008 klokken 12:01
kilden bruker
På andre språk...                            


5 svar

stemmer
48

hva er en "Unicode-streng" i Python? Betyr det at UCS-2?

Unicode strenger i Python lagres internt enten som UCS-2 (fast lengde 16-bits representasjon, nesten det samme som UTF-16) eller UCS-4 / UTF-32 (fast lengde 32-bits representasjon). Det er en samle-tid alternativ; på Windows det er alltid UTF-16, mens mange Linux-distribusjoner satt UTF-32 ( 'wide mode') for sine versjoner av Python.

Du er vanligvis ikke ment å vare: vil du se Unicode kode poeng som enkeltelementer i dine strenger, og du vil ikke vite om de er lagret som to eller fire bytes. Hvis du er i en UTF-16 build, og du trenger for å håndtere tegn utenfor Basic Multilingual Plane du skal gjør det feil, men det er fortsatt svært sjeldne, og brukere som virkelig trenger de ekstra tegnene skal samle bred bygger.

vanlig feil, eller er det?

Ja, det er helt feil. For å være ærlig tror jeg at opplæringen er ganske gamle; det trolig pre-datoer brede Unicode-strenger, om ikke Unicode 3.1 (versjonen som introduserte tegn utenfor Basic Multilingual Plane).

Det er en ekstra kilde til forvirring som stammer fra Windows er vane med å bruke begrepet “Unicode” til å bety, spesifikt, UTF-16LE koding som NT bruker internt. Folk fra Microsoftland kan ofte kopiere dette noe misvisende vane.

Svarte 07/02/2009 kl. 00:54
kilden bruker

stemmer
8

I mellomtiden, jeg gjorde en raffinert forskning for å bekrefte hva den interne representasjon i Python er, og også hva de grensene er. " Sannheten om Unicode I Python " er en veldig god artikkel som siterer direkte fra Python utviklere. Tilsynelatende er interne representasjon enten UCS-2 eller UCS-4 avhengig av en samle-tidsbryter. Så Jon, er det ikke UTF-16, men svaret sette meg på rett spor uansett, takk.

Svarte 22/08/2008 kl. 12:32
kilden bruker

stemmer
0

Python lagrer Unicode som UTF-16. str () returnerer den UTF-8 representasjon av UTF-16 streng.

Svarte 22/08/2008 kl. 12:03
kilden bruker

stemmer
-1

Fra Wikipedia på UTF-8 :

UTF-8 (8-bit UCS / Unicode Transformation Format) er et variabel-lengde-tegnkoding for Unicode. Det er i stand til å representere et hvilket som helst tegn i Unicode-standarden , men den første kodingen av byte koder og tegn oppgaver for UTF-8 er bakoverkompatibel med ASCII. Av disse grunner blir det stadig blir den foretrukne koder for e-post, web-sider [1], og andre steder hvor tegnene er lagret eller streamet.

Så det er noe mellom en og fire bytes avhengig av hvilken karakter du ønsker å representere innenfor området for Unicode.

Fra Wikipedia på Unicode:

I databehandling, er Unicode en industristandard som tillater datamaskiner å konsekvent representere og manipulere tekst uttrykt i de fleste av verdens skriftsystemer .

Så det er i stand til å representere de fleste (men ikke alle) av verdens skriftsystemer.

Jeg håper dette hjelper :)

Svarte 22/08/2008 kl. 12:10
kilden bruker

stemmer
-2

så hva er en "Unicode-streng" i Python?

Python 'vet' at strengen er Unicode. Derfor hvis du regex på den, vil den vite som er tegnet og som ikke er etc, noe som er veldig nyttig. Hvis du gjorde en strlen vil det også gi riktig resultat. Som et eksempel hvis du fikk streng stole på Hei, vil du få 5 (selv om det er Unicode). Men hvis du gjorde en streng telling av et fremmedord, og at strengen var ikke en Unicode-streng enn du vil ha mye større resultat. Pythong bruker informasjonen danner Unicode Character Database å identifisere hvert tegn i Unicode String. Håper det hjelper.

Svarte 22/08/2008 kl. 12:32
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more