2012-11-16 66 views
0

這可能是一個新手問題,但它在這裏。我有一個大string(167572字節)與ASCII和非ASCII字符。當我在字符串上使用len()時,我得到錯誤的length。看來len()不會計數0x0A個字符。我可以得到字符串的實際長度的唯一方法是使用下面的代碼:大字符串和len()

for x in test: 
    totalLen += 1 
for x in test: 
    if x == '\x0a': 
     totalLen += 1 
print totalLen 

有什麼不對len()?還是我用它錯了?

+0

當你說實際的長度,你怎麼得到的?我希望你沒有手數全部167572字節。 :-) –

+2

您的代碼會計算兩次「\ x0a''個字符。 – interjay

+0

我將字符串寫入文件並在十六進制編輯器中打開它,這就是我如何計算字符數。 –

回答

4

難道你希望它包含\r\n,即ASCII 13(回車符)後跟ASCII 10(換行符),或者在字符串被寫入文本文件後查看字符串,哪些添加了這些?

由於您沒有提供很多細節,即字符串的數據來自何處,因此很難具體。

6

您正在編碼的字節串與unicode文本混淆。例如,在UTF-8中,最多可使用3個字節對任何給定字符進行編碼,在UTF-16中,每個字符均使用至少,每個字符使用進行編碼。

python字符串是一系列字節,要獲取unicode,您必須使用適當的編解碼器來解碼字符串。如果您的文本使用UTF-8編碼,例如,你可以用解碼:

test = test.decode('utf8') 

在另一方面,寫入到文件中的數據是總是編碼,所以長度10可以的unicode字符串如果使用UTF-16編解碼器編寫,則需要佔用文件中的20個字節。

您很可能會對這些「更寬」的字符感到困惑,而不是您的\n(ASCII 10)字符被正確計數。

請請你幫個忙,並在Unicode和編碼讀了起來: