2015-06-03 84 views
0

我正在編寫一個Python腳本以從文件讀取Unicode字符並將它們插入到數據庫中。我只能插入每個字符串的30個字節。 在插入數據庫之前,如何計算字符串的大小(以字節爲單位)?計算python中的Unicode字符的字節數

回答

1

假設您正在將文件中的Unicode字符讀入名爲byteString的變量中。如果你需要知道的字節數(文件大小),然後就打電話
bytes_count = os.path.getsize(filename)

unicode_string = byteString.decode("utf-8") 
print len(unicode_string) 
+0

'uniChars'是誤導(你想在'bytes'對象上調用'.decode()';你不應該在Unicode文本中調用它)。您可能會改爲'bytestring'。 – jfs

4

:然後你就可以執行以下操作。


如果你想找出一個Unicode字符可以有多少字節需要那就要看字符編碼:

>>> print(u"\N{EURO SIGN}") 
€ 
>>> u"\N{EURO SIGN}".encode('utf-8') # 3 bytes 
'\xe2\x82\xac' 
>>> u"\N{EURO SIGN}".encode('cp1252') # 1 byte 
'\x80' 
>>> u"\N{EURO SIGN}".encode('utf-16le') # 2 bytes 
'\xac ' 

要找出多少Unicode字符的文件包含,你不需要一次讀取內存中的整個文件(如果它是一個大文件):

with open(filename, encoding=character_encoding) as file: 
    unicode_character_count = sum(len(line) for line in file) 

如果你ar e在Python 2上,然後在頂部添加from io import open

對於相同的人類可讀的文本可以取決於Unicode的正常化(不同的環境可能會使用不同的設置)的確切計數:

>>> import unicodedata 
>>> print(u"\u212b") 
Å 
>>> unicodedata.normalize("NFD", u"\u212b") # 2 Unicode codepoints 
u'A\u030a' 
>>> unicodedata.normalize("NFC", u"\u212b") # 1 Unicode codepoint 
u'\xc5' 
>>> unicodedata.normalize("NFKD", u"\u212b") # 2 Unicode codepoints 
u'A\u030a' 
>>> unicodedata.normalize("NFKC", u"\u212b") # 1 Unicode codepoint 
u'\xc5' 

如示例所示,一個字符(A)可以用幾個Unicode代碼點表示。

要找出多少用戶感知的字符在文件中,你可以使用\X正則表達式(伯爵伸出素羣):

import regex # $ pip install regex 

with open(filename, encoding=character_encoding) as file: 
    character_count = sum(len(regex.findall(r'\X', line)) for line in file) 

例子:

>>> import regex 
>>> char = u'A\u030a' 
>>> print(char) 
Å 
>>> len(char) 
2 
>>> regex.findall(r'\X', char) 
['Å'] 
>>> len(regex.findall(r'\X', char)) 
1 
+1

這應該是被接受的答案。 –