2010-03-01 23 views
1

我正在使用perl腳本來讀取文件,但我不知道該文件是什麼編碼。基本上,我的文件是書名的列表,但每本書都有與其相關的其他信息(作者,出版日期等)。所以每本書的標題都在本書的一個獨立的數據塊內。所以我通過逐行遍歷文件,直到我找到正則表達式'/Book Title: (.*)/',並採取什麼樣的方式。然後,我創建一個單獨的.txt文件,文本文件的名稱是我的書。但是,在我的unix服務器中,當我查看文件的名稱時,實際上不是,例如,'LordOfTheFlies.txt',而是'LordOfTheFlies^M.txt'Perl和使用不同的編碼讀取文件

這是什麼'^ M'?這是一個奇怪的行編碼結束,我沒有考慮到?我嘗試chomp,但它似乎並沒有工作。使用perl的最佳文件編碼是什麼?

回答

5

這是Windows系統在換行符之前插入的附加回車符(M == 13號字母,因此ASCII 13可視化爲^ M)。

它與文件編碼無關,它只是行結束策略咬你。 Perl通常擅長正確處理行尾字符,但如果它們發生在行尾以外的其他位置,則必須自行完成。您可以使用s/\ r //而不是chomp()將它們取出。

+0

你是我的英雄 – sepiroth 2010-03-01 07:51:21

0

在處理文件之前,您需要知道文件的編碼,文件的編碼由文件的製作者決定。
「^ M」是control-M,它是一個回車符,在Unix文件系統中不需要。
看起來這個文件是在Unix中創建並傳輸到Windows的。當文本文件作爲二進制文件傳輸時,它也可以用ftp添加。

0

嘗試砍,而不是'chomp'。 Chomp刪除了「新行字符」。 s/\ r //也很好。 對於您的一般問題,您可能希望使用適當的模塊作爲文件類型,使您的生活更輕鬆,更完善。