2010-05-21 6 views
-3
def _oauth_escape(val): 
    if isinstance(val, unicode):# useful ? 
     val = val.encode("utf-8")#useful ? 
    return urllib.quote(val, safe="~") 

Je pense qu'il est pas utile,ce code est-il utile?

oui ??

mis à jour

Je pense que unicode est « utf-8 », oui?

+1

Unicode n'est pas UTF-8. Ce sont des choses différentes, mais vous les verrez souvent discutées ensemble. Le lien dans la réponse d'ivo est une bonne référence pour commencer. –

Répondre

0

En Python 3.0, toutes les chaînes prennent en charge Unicode, mais avec les versions précédentes, il faut explicitement coder les chaînes en chaînes Unicode. Est-ce que ça pourrait être ça?

(utf-8 est la seule, mais le plus commun pour le codage Unicode. Lire this.)

+0

Python 2 et 3 ont deux types de chaînes, l'un pour représenter les données brutes ('str' de Python 2.x et' bytes 'de Python 3.x) et l'autre pour représenter le texte avec une séquence de codets Unicode (Python 2.x's ' unicode' et 'str' de Python 3.x). –

1

utf-8 est un codage, une recette pour représenter concrètement les données unicode comme une série d'octets. C'est l'un des nombreux encodages de ce type. Les objets Python str sont des bytestrings, qui peuvent représenter des données binaires arbitraires, telles que du texte dans un codage spécifique.

Le type unicode de Python est une manière abstraite et non codée de représenter du texte. Les chaînes Unicode peuvent être codées dans l'un des nombreux encodages.

1

Comme d'autres l'ont déjà dit, unicode et utf-8 ne sont pas les mêmes. Utf-8 est l'un des nombreux encodages pour Unicode. Pensez à unicode comme des chaînes unicode "non codées", tandis que les objets string sont codés dans un codage particulier (malheureusement, les objets chaîne n'ont pas d'attribut qui vous indique comment ils sont codés).

val.encode("utf-8") convertit cet objet unicode en objet chaîne encodé en utf-8.

En Python 2.6, cela est nécessaire car urllib ne peut pas gérer unicode correctement.

>>> import urllib 
>>> urllib.quote(u"") 
'' 
>>> urllib.quote(u"ä") 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py:1216: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
    res = map(safe_map.__getitem__, s) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", line 1216, in quote 
    res = map(safe_map.__getitem__, s) 
KeyError: u'\xe4' 
>>> urllib.quote(u"ä".encode("utf-8")) 
'%C3%A4' 

3.x Python cependant, où toutes les chaînes sont unicode (Python 3 équivalent à une chaîne codée est un objet bytes), il est plus nécessaire.

>>> import urllib.parse 
>>> urllib.parse.quote("ä") 
'%C3%A4'