2010-11-21 15 views
6

i tienen una cadena Unicode big endian de 16 bits representado como u '\ u4132',conseguir bytes de cadena Unicode en Python

cómo puedo dividirlo en enteros de 41 y 32 en Python?

+1

El conjunto pregunta necesita explicación. No existe una "cadena unicode bigendiana de n bits". Lo que tienes es un objeto Unicode de longitud 1. En segundo lugar, la representación es HEXAdecimal. ¿Qué quieres que haga con 'u '\ uabcd''? En tercer lugar, ¿POR QUÉ quieres que se divida en bytes? –

Respuesta

13

Aquí hay una variedad de maneras diferentes que usted puede querer él.

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')

Estos métodos devuelven una matriz de bytes, que se puede convertir en una matriz int fácilmente. Pero tenga en cuenta que los puntos de código por encima de U+FFFF se codificarán utilizando dos unidades de código (por lo que con UTF-16BE esto significa 32 bits o 4 bytes).

+0

¿por qué usaste la 'u' antes de la cadena en python 3? – Ant

+0

Gracias por la nota, lo arreglé en la respuesta. –

2

"Esos" no son enteros, es un número hexadecimal que representa el code point.

Si desea obtener una representación entera del punto de código que necesita usar ord(u'\u4132') si ahora desea convertir eso al carácter unicode, utilice unicode() que devolverá una cadena Unicode.

+0

sí, sé que no son enteros, pero al final de la operación necesito obtener 41 y 32 como números enteros, por eso mencioné el número entero. como corrección "cómo puedo convertir u" \ u4132 "a string o int 4132" podría ser mejor :) – hinoglu

+1

@hinoglu: si de verdad quieres obtener 41 y 32 como enteros, es probable que tu aplicación se rompa. ¿Qué comportamiento razonable debería tener si en lugar de U '\ U4132' dijeras u '\ U412F'? Que es tan válido como el otro. Si bien puede haber motivos para querer obtener la cadena '4132' desde arriba (o '412F'), no puedo imaginar ninguna razón sensata para querer obtener el número entero 4132. Excepto que puede ser para convertirlo a la cadena '4132 ¿? ¿Podrías explicar tu caso de uso? – kriss

1

truco sucio: repr(u'\u4132') volverá "u'\\u4132'"

+0

pero un truco de trabajo, gracias :) – hinoglu

+0

Eek. * Por favor * mira las otras respuestas (¡qué casualidad - escribí una ;-)) - logran lo mismo sin ese truco horrible! –

2
>>> c = u'\u4132' 
>>> '%x' % ord(c) 
'4132' 
Cuestiones relacionadas