2010-11-02 4 views
1

J'ai essayé de convertir une chaîne ASCII en une chaîne échappée pseudo unicode échappée en utilisant Python, mais a échoué jusqu'à présent.Python: print unicode char a échappé

Ce que je veux faire: Convertir ASCII « a » en ASCII String « <U0061> »

je peux convertir « un » avec unicode (« a »), mais ne peut pas en sécurité la valeur numérique d'un dans un chaîne ASCII.

Comment puis-je faire cela?

+0

Ce que je veux faire: Convertir ASCII 'a' en ASCII Chaîne" U + 0061 " – user494510

+1

Et si c'est en dehors du BMP? –

+0

Pourquoi le BMP est-il pertinent? Un point de code est un point de code. Python n'a-t-il pas de caractères abstraits? – tchrist

Répondre

5

Vous pouvez utiliser ord() pour convertir un caractère en valeur de caractère (str) ou en code (unicode). Vous pouvez ensuite utiliser la mise en forme de chaîne appropriée pour la convertir en une représentation textuelle.

'U+%04X' % (ord(u'A'),) 
+0

Échec: '' U +% 04X '% (ord (u' \ U000010eeb '),)'. Mais en Perl, 'printf" U +% 05X \ n ", ord (chr (0x10eebA))' imprime correctement le 'U + 10EEBA' attendu. Quel est le problème avec le modèle de chaînes et/ou de caractères de Python? Quelque chose semble cassé ici. – tchrist

+0

@tchrist, avez-vous une construction python large ou étroite? Le caractère Unicode en construction étroite (typique sous Windows) est limité à la plage 0-0xffff. – Constantin

+0

@Constantine, apparemment j'ai une "construction étroite" - quoi que cela signifie. Je suis sur un Apple, pas une boîte de Microsoft. Comment écrivez-vous Python portable si vous êtes obligé de toujours penser à la disposition physique des personnages dans les différents encodages? Je veux juste traiter un flux UTF-8, peu importe si les caractères sont ASCII, dans le BMP, dans le SMP, ou n'importe où ailleurs. Pourquoi les caractères Unicode ne sont pas seulement des caractères Unicode? Pourquoi est-il possible de construire Python pour qu'il ne puisse pas gérer Unicode correctement? – tchrist

1

Voici un exemple minimaliste qui vous permet d'utiliser la solution d'Ignacio avec le moteur de codage/décodage intégré de Python. Vérifiez http://docs.python.org/library/codecs.html si vous avez besoin quelque chose de plus cohérent (avec manipulation d'erreur appropriée, etc ...)

import codecs 


def encode(text, error="strict"): 
    return ("".join("<U%04x>" % ord(char) for char in text), len(text)) 

def search(name): 
    if name == "unicode_ltgt": 
     info = codecs.CodecInfo(encode, None, None, None) 
     info.name = "unicode_ltgt" 
     info.encode = encode 
     return info 
    return None 

codecs.register(search) 

if __name__ == "__main__": 
    a = u"maçã" 
    print a.encode("unicode_ltgt") 

(tout en important comme module, le codec « unicode_ltgt » sera installé et disponible à tout ». encoder "appeler, comme dans l'exemple donné)