2012-08-06 14 views
6

Ho una stringa coreana codificata come Unicode come u'정정'. Come faccio a sapere quanti byte sono necessari per rappresentare questa stringa?Ottieni il numero di byte necessari per una stringa Unicode

Ho bisogno di conoscere il numero esatto dei byte poiché sto usando la stringa per la notifica push di iOS e ha un limite sulla dimensione del payload.

len('정정') non funziona perché restituisce il numero di caratteri, non il numero di byte.

risposta

14

è necessario sapere che cosa codifica si vuole misurare la dimensione di byte in:

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

Sei sicuro di voler rivedere il Python Unicode HOWTO per apprezzare appieno la differenza tra un oggetto unicode e di byte codifica.

Un altro articolo eccellente è The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!), di Joel Spolsky (una delle persone dietro Stack Overflow).

+0

Come sapevi che questo carattere è "\ uC815"? Che cos'è la codifica? Ho provato utf-8/16/32 e nessuno di loro è corretto, ma "\ uC815" sembra funzionare. – jasondinh

+0

Ho un'applicazione chiamata UnicodeChecker che uso per riferimento, ma 'C815' è il punto codice unicode. Se si conosce la sequenza di byte UTF-8 o UTF-16, è possibile * decodificare * da quello per ottenere il carattere unicode (''\ xEC \ xA0 \ x95'.decode (' UTF-8 ')'). Il prompt di python è utile qui; python userà la sua codifica 'unicode_escape' quando eche (non stampando) valori unicode al terminale, per esempio. –

+2

La lunghezza della codifica UTF-16 implica che il BOM UTF-16 sia incluso. Non so se Python supporti qualcosa come 'encode ('UTF-16BE')' per evitarlo. – bames53

4

Il numero di byte richiesto per rappresentare lo unicode varia in base alla codifica utilizzata.

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

Se avete intenzione di riutilizzare il risultato di codifica, vi consiglio di codifica una volta, quindi tirando la sua len e riutilizzare il risultato già codificato in seguito.

0

Assicurarsi di utilizzare lo standard encoding corretto.

Se non lo sei, puoi sempre decodedString = myString.decode('UTF-8') (sostituire UTF-8 con la stringa di codifica corretta che puoi trovare dal link precedente, se non UTF-8) per ottenere la stringa in un formato dove len(decodedString) deve restituire il corretto numero di

Problemi correlati