Perl和读取具有不同编码的文件

时间:2010-03-01 07:35:27

标签: perl input file-encodings

我使用perl脚本读取文件,但我不确定文件的编码方式。基本上,我的文件是书名列表,但每本书都有其他相关信息(作者) ,出版日期等)。因此,每本书的标题都在书的一个独立的数据块中。所以我逐行遍历文件,直到找到正则表达式'/Book Title: (.*)/'并取出paren中的内容。然后,我创建一个单独的.txt文件,其文本文件的名称是我的书。但是,在我的unix服务器中,当我查看文件名时,实际上并不是'LordOfTheFlies.txt',而是'LordOfTheFlies^M.txt'

这是什么'^ M'?这是一个奇怪的行编码结束我没有考虑到?我尝试了chomp但它似乎没有工作。使用perl的最佳文件编码是什么?

3 个答案:

答案 0 :(得分:5)

这是Windows系统在换行符之前插入的附加回车符(M == 13th letter,因此ASCII 13可视化为^ M)。

它与文件编码无关,它只是咬你的行结束政策。 Perl通常擅长正确处理行结尾字符,但如果它们出现在除行尾之外的其他地方,则必须自己完成。您可以使用s / \ r //而不是chomp()来取出它们。

答案 1 :(得分:0)

在处理文件之前,您需要知道文件的编码,该编码由文件的制作者确定 “^ M”是control-M,它是一个回车符,在Unix文件系统中不需要。
看起来该文件是在Unix中创建并传输到Windows的。当文本文件作为二进制文件传输时,它也可以使用ftp添加。

答案 2 :(得分:0)

尝试砍,而不是'chomp'。 Chomp删除'新行字符'。 s / \ _ //也很好。 对于您的一般性问题,您可能希望使用适当的模块作为文件类型,使用Perl使您的生活更轻松,更好。