2012-08-06 5 views
6

Ich habe eine koreanische Zeichenfolge, die als Unicode wie u'정정' kodiert ist. Woher weiß ich, wie viele Bytes benötigt werden, um diese Zeichenfolge darzustellen?Ermitteln Sie die Anzahl der für eine Unicode-Zeichenfolge benötigten Bytes.

Ich muss die genaue Anzahl der Bytes wissen, da ich die Zeichenfolge für iOS Push-Benachrichtigung verwenden und es hat eine Grenze für die Größe der Nutzlast.

len('정정') funktioniert nicht, weil das die Anzahl der Zeichen, nicht die Anzahl der Bytes zurückgibt.

Antwort

14

Sie müssen wissen, was Codierung Sie in Ihrem Byte-Größe messen möchten:

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

Sie wollen wirklich die Python Unicode HOWTO vollständig den Unterschied zwischen einem Unicode-Objekt und das Byte schätzen überprüfen Codierung.

Ein weiterer ausgezeichneter Artikel ist The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!), von Joel Spolsky (einer der Leute hinter Stack Overflow).

+0

Woher wussten Sie, dass dieser Char '\ uC815' ist? Welche Codierung ist das? Ich habe es utf-8/16/32 versucht und keiner von ihnen ist korrekt, aber "u815" scheint zu funktionieren. – jasondinh

+0

Ich habe eine Anwendung namens UnicodeChecker, die ich als Referenz verwenden, aber 'C815' ist der Unicode-Codepunkt. Wenn Sie die UTF-8- oder UTF-16-Bytefolge kennen, können Sie * daraus entschlüsseln, um das Unicode-Zeichen zu erhalten ('\ xEC \ xA0 \ x95'.decode ('UTF-8')'). Die Python-Eingabeaufforderung ist hier hilfreich; Python wird seine "Unicode_escape" -Codierung verwenden, wenn Unicode-Werte beispielsweise an das Terminal gesendet (nicht gedruckt) werden. –

+2

Die Länge der UTF-16-Codierung impliziert, dass die UTF-16-Stückliste eingeschlossen wird. Ich weiß nicht, ob Python etwas wie 'encode ('UTF-16BE') unterstützt, um es zu vermeiden. – bames53

4

Die Anzahl der zur Darstellung der unicode erforderlichen Bytes hängt von der verwendeten Codierung ab.

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

Wenn Sie vorhaben, die Codierung Ergebnis wieder zu verwenden, empfehle ich es einmal kodiert, dann zieht seine len und Wiederverwendung der bereits kodierten Ergebnis später.

0

Stellen Sie sicher, dass Sie die richtige standard encoding verwenden.

Wenn Sie nicht, Sie können immer decodedString = myString.decode('UTF-8') (Ersatz UTF-8 mit der richtigen Codierung Zeichenfolge, die Sie aus dem vorherigen Link finden können, wenn nicht UTF-8) die Zeichenfolge in ein Format zu bekommen, wo len(decodedString) zurückkehren sollte die richtige Anzahl