为什么读入UTF-16LE文件不会将“\ r \ n”转换为“\ n”在Windows中

时间:2010-04-13 03:27:40

标签: perl unicode encoding

我使用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中匹配的字符串最后会包含一个“\ _”...

2 个答案:

答案 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?