代码之家  ›  专栏  ›  技术社区  ›  Baiyan Huang

为什么在Windows中以utf-16le文件读取无法将\r\n“转换为\n”

  •  1
  • Baiyan Huang  · 技术社区  · 15 年前

    我正在使用Perl读取Windows7中的utf-16le文件。

    如果我在包含以下代码的ASCII文件中读取,则文件中的每个“\r\n”都将转换为内存中的一个“\n”:

    open CUR_FILE, "<", $asciiFile; 
    

    如果我用以下代码读取一个utf-16le(Windows1200)文件,那么当我尝试用换行符来regexp行时,这种不一致性会导致问题。

    open CUR_FILE, "<:encoding(UTF-16LE)", $utf16leFile;
    

    则“\r\n”将保持不变。

    更新:
    对于utf-16le文件的每一行:

    line =~ /(.*)$/
    

    然后$1中匹配的字符串将在末尾包含一个“\r”…

    2 回复  |  直到 15 年前
        1
  •  1
  •   cjm    15 年前

    您使用的是什么版本的Perl?UTF-16和CRLF处理在5.8.9之前没有正确混合( Unicode changes in 5.8.9 )我不确定5.10.0,但它在5.10.1和5.8.9中有效。你可能需要使用 "<:encoding(UTF-16LE):crlf" 打开文件时。

        2
  •  0
  •   dawg    15 年前

    这就是Windows为您表演的魔法……如果指定utf,这相当于以二进制模式与文本打开文件。

    Perl的较新版本有一个通用换行符(即,将同时匹配\r\n和\n)以及\v,它将匹配所有操作系统和Unicode垂直空白概念(即,不间断空格等)。

    regex逻辑允许使用\r而不是\n吗?