【问题标题】:Perl and reading files with different encodingsPerl 和读取不同编码的文件
【发布时间】:2010-03-01 07:35:27
【问题描述】:
我正在使用 perl 脚本读取文件,但我不确定文件的编码是什么。基本上,我的文件是书名列表,但每本书都有与之关联的其他信息(作者、出版日期等)。因此,每本书的标题都在该书的离散数据块中。因此,我逐行遍历文件,直到找到正则表达式 '/Book Title: (.*)/' 并获取括号中的内容。然后,我创建了一个单独的 .txt 文件,文本文件的名称是我的书。但是,在我的unix服务器中,当我查看文件名时,它实际上不是,例如'LordOfTheFlies.txt',而是'LordOfTheFlies^M.txt'
这个'^M'是什么?这是我没有考虑到的奇怪的行尾编码吗?我试过 chomp 但它似乎没有用。使用 perl 的最佳文件编码是什么?
【问题讨论】:
标签:
perl
input
file-encodings
【解决方案1】:
这是 Windows 系统在换行符之前插入的附加回车符(M == 第 13 个字母,因此 ASCII 13 可视为 ^M)。
它与文件编码无关,它只是咬你的行尾策略。 Perl 通常擅长正确处理行尾字符,但如果它们出现在行尾以外的其他地方,您必须自己处理。您可以使用 s/\r// 而不是 chomp() 来获取它们。
【解决方案2】:
在处理文件之前,你需要知道文件的编码,这是由文件的生产者决定的。
"^M" 是 control-M,它是一个回车,在 Unix 文件系统中不需要。
看起来该文件是在 Unix 中创建并传输到 Windows 的。当文本文件作为二进制文件传输时,它也可以与 ftp 一起添加。
【解决方案3】:
尝试剁碎,而不是“剁碎”。 Chomp 删除了“换行符”。 s/\r// 也不错。
对于您的一般问题,您可能希望针对您必须使用 Perl 使您的生活更轻松、更好的文件类型使用适当的模块。