我使用Perl在Windows 7中读取UTF-16LE文件。
如果我使用以下代码读入ASCII文件,那么文件中的每个“\ r \ n”将在内存中转换为“\ n”:
open CUR_FILE, "<", $asciiFile;
如果我使用以下代码读入UTF-16LE(Windows 1200)文件,当我尝试使用换行符重新定位行时,这种不一致会导致问题。
open CUR_FILE, "<:encoding(UTF-16LE)", $utf16leFile;
然后“\ r \ n”将保持不变。
更新
对于UTF-16LE文件的每一行:
line =~ /(.*)$/
然后在$ 1中匹配的字符串最后会包含一个“\ _”...
答案 0 :(得分:1)
您使用的是什么版本的Perl?在5.8.9(Unicode changes in 5.8.9)之前,UTF-16和CRLF处理没有正确混合。我不确定5.10.0,但它适用于5.10.1和5.8.9。打开文件时可能需要使用"<:encoding(UTF-16LE):crlf"
。
答案 1 :(得分:0)
这就是为你执行魔术的Windows ....如果指定UTF,这相当于以二进制模式打开文件与文本。
较新版本的Perl具有\ R,它是一个通用换行符(即,将匹配\ r \ n和\ n)以及\ v,它将匹配垂直空白的所有OS和Unicode概念(即, \ r \ n \ r \ n不间断空间等)
你的正则表达式逻辑是否允许使用\ R而不是\ n?