2012-12-14 68 views
3

我的問題很簡單。我想用我的Perl腳本輸出UTF-8。 此代碼無法使用。使用perl bug編寫utf8?

use utf8; 
open(TROIS,">utf8.out.2.txt"); 
binmode(TROIS, ":utf8"); 
print TROIS "Hello\n";   

輸出文件不是UTF-8。 (我的文件腳本使用UTF-8編碼) 但是,如果我在我的print中插入加重字符,那麼它正在工作,我的輸出文件是UTF-8。例如:

print TROIS "é\n"; 

我在Windows下使用ActivePerl 5.10。可能是什麼問題?

+12

你只寫了'Hello \ n'的ASCII字符。幸運的是,ASCII仍然是完全有效的UTF-8。但是,編輯器自動檢測很可能不會顯示UTF-8編碼,因爲它們沒有任何內容來判斷文件內容的編碼。我猜你根本不知道文件編碼是如何工作的。 –

+0

謝謝你的解釋。 – user1903343

+2

@Moritz:請將您的解釋作爲答案。 user1903343應該將其標記爲已接受,以便此問題不再顯示爲「未解決」。 – tripleee

回答

10

你在寫什麼東西,除了ASCII字符Hello\n。幸運的是,ASCII仍然是完全有效的UTF-8。但是,編輯器的自動檢測很可能不會顯示UTF-8作爲編碼,因爲他們沒有任何東西來判斷文件內容的編碼。我猜你根本不知道文件編碼是如何工作的。

文件的編碼是一般不存儲在文件中或文件外部的屬性。很多編輯根據他們運行的操作系統或環境設置(系統語言)簡單地假定某種編碼,或者他們包含某種半智能自動檢測(可能仍會失敗,因爲文件編碼不能自動檢測)明確檢測到)。這就是爲什麼當你用binmode或相應的I/O層讀取文件時,你必須告訴Perl文件使用UTF-8編碼。

現在有一種標記文本文件編碼的方法,如果所述編碼是UTF族(UTF-8,UTF-16 LE和BE,UTF-32 LE和BE)之一。這種方式被稱爲BOM (byte order mark)。但是,生成帶有BOM的文件來自於UTF-8尚未像今天這樣普及的時候。它通常會帶來更多不同的問題,尤其是由於編輯和應用程序通常不支持BOM。因此,現在可能應該避免材料清單。

當然也有例外,其中文件格式包含某些指示文件編碼的指令。 XML的想法與DOCTYPE聲明。但是,即使對於這樣的文件,您也必須識別文件是否以多字節編碼進行編碼,該編碼通常每個字符至少使用兩個字節(UTF-16/UTF-32),否則爲了解析DOCTYPE聲明第一個地方。這不是簡單的;)