Ich habe eine Zeichenfolge, die über ein Netzwerk gesendet werden soll. Ich muss die Gesamtzahl der Bytes überprüfen, in denen es dargestellt wird.
sys.getsizeof(string_name)
gibt zusätzliche Bytes zurück. Zum Beispiel für sys.getsizeof("a")
Rückgabe 22, während ein Zeichen in Python nur in 1 Byte dargestellt wird. Gibt es eine andere Methode, um dies zu finden?
Antworten:
Wenn Sie die Anzahl der Bytes in einer Zeichenfolge möchten, sollte diese Funktion dies ziemlich solide für Sie tun.
def utf8len(s): return len(s.encode('utf-8'))
Der Grund, warum Sie seltsame Zahlen erhalten haben, ist, dass in eine Zeichenfolge eingekapselt eine Reihe anderer Informationen enthalten sind, da Zeichenfolgen tatsächliche Objekte in Python sind.
Es ist interessant, denn wenn Sie sich meine Lösung zum Codieren des Strings in 'utf-8' ansehen, gibt es eine 'encode'-Methode für das' s'-Objekt (das ein String ist). Nun, es muss irgendwo aufbewahrt werden, oder? Daher ist die Anzahl der Bytes höher als normal. Es beinhaltet diese Methode, zusammen mit ein paar anderen :).
quelle
len('你'.encode('utf-8'))
.Die akzeptierte Antwort enthält eine Einschränkung.
Bei einigen Mehrbyte-Codierungen (z. B. utf-16)
string.encode
wird zu Beginn ein Byte Order Mark (BOM) hinzugefügt. Hierbei handelt es sich um eine Folge von speziellen Bytes, die den Leser über die verwendete Bytenendigkeit informieren . Die Länge, die Sie erhalten, ist also tatsächlichlen(BOM) + len(encoded_word)
.Wenn Sie die Stücklistenbytes nicht zählen möchten, können Sie entweder die Little-Endian-Version der Codierung (Hinzufügen des Suffixes "-le") oder die Big-Endian-Version (Hinzufügen des Suffix "be") verwenden.
>>> len('ciao'.encode('utf-16')) 10 >>> len('ciao'.encode('utf-16-le')) 8
quelle