2010-11-21 6 views
6

i ont un 16bit grand endian chaîne unicode représentée comme u '\ u4132',obtenir octets de chaîne unicode en python

comment puis-je diviser des nombres entiers 41 et 32 ​​en python?

+1

Toute la question a besoin d'explication. Il n'y a pas de "chaîne unicode bigendian n bits". Ce que vous avez est un objet unicode de longueur 1. Deuxièmement, la représentation est HEXAdecimal. Que veux-tu faire avec 'u' \ uabcd''? Troisièmement, pourquoi voulez-vous le diviser en octets? –

Répondre

13

Voici une variété de façons différentes que vous voudrez peut-être cela.

Python 2:

>>> chars = u'\u4132'.encode('utf-16be') 
>>> chars 
'A2' 
>>> ord(chars[0]) 
65 
>>> '%x' % ord(chars[0]) 
'41' 
>>> hex(ord(chars[0])) 
'0x41' 
>>> ['%x' % ord(c) for c in chars] 
['41', '32'] 
>>> [hex(ord(c)) for c in chars] 
['0x41', '0x32'] 

Python 3:

>>> chars = '\u4132'.encode('utf-16be') 
>>> chars 
b'A2' 
>>> chars = bytes('\u4132', 'utf-16be') 
>>> chars # Just the same. 
b'A2' 
>>> chars[0] 
65 
>>> '%x' % chars[0] 
'41' 
>>> hex(chars[0]) 
'0x41' 
>>> ['%x' % c for c in chars] 
['41', '32'] 
>>> [hex(c) for c in chars] 
['0x41', '0x32'] 
4
  • Java: "\u4132".getBytes("UTF-16BE")
  • Python 2: u'\u4132'.encode('utf-16be')
  • Python 3: '\u4132'.encode('utf-16be')

Ces méthodes renvoient un tableau d'octets, que vous pouvez convertir en un tableau int facilement. Mais notez que les points de code au-dessus de U+FFFF seront codés en utilisant deux unités de code (donc avec UTF-16BE cela signifie 32 bits ou 4 octets).

+0

pourquoi avez-vous utilisé le 'u' avant la chaîne dans python 3? – Ant

+0

Merci pour la note, je l'ai corrigé dans la réponse. –

2

"Ceux" ne sont pas des entiers, c'est un nombre hexadécimal qui représente le code point.

Si vous souhaitez obtenir une représentation entière du point de code, vous devez utiliser ord(u'\u4132') si vous voulez maintenant le convertir en caractère unicode, utilisez unicode() pour retourner une chaîne unicode.

+0

oui je sais qu'ils ne sont pas entiers, mais à la fin de l'opération, j'ai besoin d'obtenir 41 et 32 ​​comme entiers, c'est pourquoi j'ai mentionné entier. comme une correction "comment puis-je convertir u" \ u4132 "en chaîne ou int 4132" pourrait être mieux :) – hinoglu

+1

@hinoglu: si vous voulez en effet obtenir 41 et 32 ​​comme entiers, votre application est susceptible d'être brisée. Quel comportement sensé devrait-il avoir si au lieu de 'U4132' vous avez dit 'U412F'? Ce qui est aussi valide que l'autre. Autant il peut y avoir des raisons de vouloir obtenir la chaîne '4132' d'en haut (ou '412F') je ne peux pas imaginer de raison raisonnable pour vouloir obtenir l'entier 4132. Sauf peut-être pour la convertir en chaîne '4132 '? Pouvez-vous expliquer votre cas d'utilisation? – kriss

1

bidouille: repr(u'\u4132') retournera "u'\\u4132'"

+0

mais un hack de travail, merci :) – hinoglu

+0

Eek. * S'il vous plaît * regardez les autres réponses (quelle coïncidence - j'ai écrit un ;-)) - ils réalisent la même chose sans ce hack horrible! –

2
>>> c = u'\u4132' 
>>> '%x' % ord(c) 
'4132' 
Questions connexes