Domanda

Sto cercando di capire come python 2.5 offerte con stringhe unicode.Anche se ormai credo di avere una buona comprensione di come dovrei gestire in codice, non ho completamente capire che cosa sta succedendo dietro le quinte, in particolare quando si tipo di corde all'interprete di comandi.

Così python pre 3.0 dispone di due tipi di stringhe, e cioè: str (stringhe di byte) e unicode, che sono entrambi derivati da basestring.Il tipo di default per le stringhe è str.

str gli oggetti non hanno idea del loro effettiva codifica, sono solo byte.O hai codifica una stringa unicode e pertanto di sapere che cosa la codifica in cui si trovano, o hai letto un flusso di byte, la cui codifica è anche sapere in anticipo (indeally).Si può intuire la codifica di una stringa di byte di cui codifica è sconosciuto, ma semplicemente non è un modo affidabile per capire questo fuori.La vostra scommessa migliore è quello di decodificare, a usare unicode ovunque nel codice e codificare in ritardo.

Va bene.Ma le stringhe digitato nell'interprete, in effetti, sono codificati per voi dietro la schiena?A condizione che la mia comprensione di stringhe in Python è corretto, qual è il metodo di impostazione/python utilizza per prendere questa decisione?

La fonte della mia confusione è i diversi risultati che ottengo quando cerco la stessa cosa sul mio sistema, installazione di python, e sul mio editor incorporato console python.

 # Editor (Sublime Text)
 >>> s = "La caña de España"
 >>> s
 'La ca\xc3\xb1a de Espa\xc3\xb1a'
 >>> s.decode("utf-8")
 u'La ca\xf1a de Espa\xf1a'
 >>> sys.getdefaultencoding()
 'ascii'

 # Windows python interpreter
 >>> s= "La caña de España"
 >>> s
 'La ca\xa4a de Espa\xa4a'
 >>> s.decode("utf-8")
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
     return codecs.utf_8_decode(input, errors, True)
 UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 5: unexpected code byte
 >>> sys.getdefaultencoding()
 'ascii'
È stato utile?

Soluzione

Mi permetta di espandere Ignacio risposta:In entrambi i casi c'è un ulteriore livello tra Python e:in un caso si è Sublime Text e in altri cmd.exe.La differenza di comportamento che vedete non è a causa di Python, ma da diverse codifiche utilizzate da Sublime Text (utf-8, come sembra) e cmd.exe (cp437).

Così, quando si digita ñ, Sublime Text invia '\xc3\xb1' per Python, mentre cmd.exe invia \xa4.[Io sono simplyfing qui, omettendo dettagli che non sono rilevanti per la domanda.].

Ancora, Python sa che.Da cmd.exe probabilmente otterrete qualcosa di simile:

>>> import sys
>>> sys.stdin.encoding
'cp437'

considerando che nell' Sublime Text si otterrà qualcosa di simile

>>> import sys
>>> sys.stdin.encoding
'utf-8'

Altri suggerimenti

L'interprete utilizza il prompt dei comandi nativi di codifica per l'immissione di testo.Nel tuo caso è CP437:

>>> print '\xa4'.decode('cp437')
ñ

Siete confusi, perché l'editor e l'interprete utilizza diverse codifiche di se stessi.L'interprete python utilizza il sistema di default (in questo caso, cp437), mentre l'editor che usi utf-8.

Nota, la differenza scompare se si specifica una stringa unicode, in questo modo:

# Windows python interpreter
>>> s = "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s = u"La caña de España"
>>> s
u'La ca\xf1a de Espa\xf1a'

La morale della storia?Le codifiche sono difficili.Assicuratevi di sapere che la codifica del file di origine sono, o giocare sul sicuro utilizzando sempre sfuggito versione di caratteri speciali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top