2017-02-06 3 views
1

Je suis en train d'utiliser la méthode encode de chaînes de python pour retourner les codes d'échappement unicode pour les personnages, comme ceci:Comment puis-je obtenir python '' .encode ('unicode_escape') pour retourner les codes d'échappement pour ascii?

>>> print('ф'.encode('unicode_escape').decode('utf8')) 
\u0444 

Cela fonctionne très bien avec des caractères non-ascii, mais pour les caractères ascii, il retourne juste la caractères ascii eux-mêmes:

>>> print('f'.encode('unicode_escape').decode('utf8')) 
f 

La sortie désirée serait \u0066. Ce script est à des fins pédagogiques.

Comment puis-je obtenir les codes hexadécimaux Unicode pour TOUS les caractères?

+0

Que vous attendez-vous ' 'f'' pour revenir? –

+0

Vous ne pouvez pas. 'unicode_escape' n'échappera jamais les caractères ASCII imprimables. Qu'est-ce que vous essayez de faire ici? En d'autres termes, quel est le * but réel *? –

+0

@MartijnPieters Voir les modifications ci-dessus. Le script est à des fins pédagogiques, et la sortie de 'f' serait' \ u0066'. – reynoldsnlp

Répondre

2

Votre requête est un peu bizarre. En Python, nous utiliserions simplement ord à la place. Il n'y a pas besoin d'encodage/décodage ici.

>>> '"\\U{:08x}"'.format(ord('f')) # ...or \u{:04x} if you prefer 
'"\\U00000066"' 
>>> eval(_) 
'f' 
+0

Merci! La combinaison des spécifications 'ord' et' x' pour le format hexadécimal semble fonctionner parfaitement. – reynoldsnlp

1

Vous auriez à le faire manuellement; Si vous supposez que toutes vos entrées sont dans le BMP Unicode, alors une expression rationnelle directe sera probablement la plus rapide; cela remplace tous les caractères avec leur \uhhhh évasion:

import re 

def unicode_escaped(s, _pattern=re.compile(r'[\x00-\uffff]')): 
    return _pattern.sub(lambda m: '\\u{:04x}'.format(
     ord(m.group(0))), s) 

J'ai explicitement limité le modèle à la BMP pour gérer correctement les points non-BMP.

Démo:

>>> print(unicode_escaped('foo bar ф')) 
\u0066\u006f\u006f\u0020\u0062\u0061\u0072\u0020\u0444