2012-07-12 67 views
1

我不能得到關於Python如何在文件處理Unicode一握...Python中的Unicode文件中

f = open('test.txt', 'w') 
f.write('abc') 
f.close() 

這給了3個字節的文件。

f = open('test.txt', 'w') 
f.write('abcé') 
f.close() 

這給了5個字節的文件(é佔據兩個字節,但Python是怎樣知道它必須有讀2個字節?)

f = open('test.txt', 'w') 
f.write('abcそ') # a Japanese character 
f.close() 

這給出了6個字節的文件(そ需要三個字節,但Python如何知道它必須讀取3個字節?)

所以我可以理解,Unicode需要兩個字節,但它有時是1或2或3字節,我看不見怎麼運行的。

+1

http://en.wikipedia.org/wiki/Variable-length_code ,http://en.wikipedia.org/wiki/UTF-8 – 2012-07-12 19:56:04

+2

我不知道爲什麼這很重要,但這不是一箇中國字。 – quantum 2012-07-12 19:56:12

+0

oops ...你說得對,它是日文,改變了評論... – Paul 2012-07-12 19:59:37

回答

4

默認情況下,它將輸出文件編碼爲UTF-8,它是一種可變長度編碼:它使用1字節編碼ASCII字符(編碼點U + 0000-U + 007F),編碼點U + 0080使用2個字節的U + 07FF(其中包括拉丁-1字符,如é),使用3個字節的代碼點U + 0800-U + FFFF(包括中文和日文字符,如そ),代碼點U + 10000- U + 10FFFF使用4個字節。

如果要使用不同的編碼,如UTF-16,可以使用str.encode使用所需的編碼:

# Save the string as UTF-16 little-endian 
f = open('test.txt', 'w') 
f.write(u'abcそ'.encode('utf-16le') # Output will be 8 bytes 
f.close() 
+0

謝謝,文檔http:// docs .python.org/tutorial/inputoutput.html沒有提到寫入默認爲utf-8,但是這解釋了這一切。 – Paul 2012-07-12 20:04:18

+1

寫的不是什麼,而是解釋器如何解釋你的代碼:你的代碼很可能被你的編輯器以UTF-8保存到磁盤,所以當解釋器讀取它時,它會看到一個UTF-8字符串文字,這就是傳遞給文件的內容。 – 2012-07-12 20:11:53

+0

這是我使用的Python解釋器,所以默認爲UTF-8,再次thanx! – Paul 2012-07-12 20:19:09