2012-08-06 21 views
6

Tengo una cadena coreana codificada como Unicode como u'정정'. ¿Cómo sé cuántos bytes se necesitan para representar esta cadena?Obtenga la cantidad de bytes necesarios para una cadena Unicode

Necesito saber el número exacto de bytes porque estoy usando la cadena para la notificación de inserción de iOS y tiene un límite en el tamaño de la carga útil.

len('정정') no funciona porque eso devuelve el número de caracteres, no el número de bytes.

Respuesta

14

usted necesita saber lo que codificación se quiere medir su tamaño en bytes en:

>>> print u'\uC815\uC815' 
정정 
>>> print len(u'\uC815\uC815') 
2 
>>> print len(u'\uC815\uC815'.encode('UTF-8')) 
6 
>>> print len(u'\uC815\uC815'.encode('UTF-16-LE')) 
4 
>>> print len(u'\uC815\uC815'.encode('UTF-16')) 
6 
>>> print len(u'\uC815\uC815'.encode('UTF-32-LE')) 
8 
>>> print len(u'\uC815\uC815'.encode('UTF-32')) 
12 

usted realmente desea revisar la Python Unicode HOWTO para apreciar plenamente la diferencia entre un objeto unicode y de bytes codificación

Otro excelente artículo es The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!), por Joel Spolsky (una de las personas detrás de Stack Overflow).

+0

¿Cómo sabías que este carácter es '\ uC815'? ¿Qué codificación es esta? Probé utf-8/16/32 y ninguno de ellos es correcto, pero '\ uC815' parece estar funcionando. – jasondinh

+0

Tengo una aplicación llamada UnicodeChecker que uso como referencia, pero 'C815' es el punto de código Unicode. Si conoces la secuencia de bytes UTF-8 o UTF-16, puedes * decodificar * para obtener el carácter Unicode (''\ xEC \ xA0 \ x95'.decode (' UTF-8 ')'). El aviso de Python es útil aquí; python usará su codificación 'unicode_escape' cuando haga eco (no imprima) valores unicode al terminal, por ejemplo. –

+2

La longitud de la codificación UTF-16 implica que se incluye la lista de materiales UTF-16. No sé si Python admite algo como 'encode ('UTF-16BE')' para evitarlo. – bames53

4

El número de bytes necesarios para representar unicode varía según la codificación que utilice.

>>> s = u'정정' 
>>> len(s) 
2 
>>> len(s.encode('UTF-8')) 
6 
>>> len(s.encode('UTF-16')) 
6 
>>> len(s.encode('UTF-32')) 
12 

Si se va a reutilizar el resultado de codificación, recomiendo que lo codifica una vez, a continuación, tirando su len y reutilizar el resultado ya codificados después.

0

Asegúrese de estar utilizando el standard encoding correcto.

Si no es así, siempre se puede decodedString = myString.decode('UTF-8') (sustituto UTF-8 con la serie de codificación correcta que se puede encontrar desde el enlace anterior, si no UTF-8) para obtener la cadena en un formato en el len(decodedString) deberían volver el número apropiado

Cuestiones relacionadas