代码之家  ›  专栏  ›  技术社区  ›  JoelFan

Perl中使用Unicode的CRLF翻译

  •  2
  • JoelFan  · 技术社区  · 14 年前

    我试图在Windows上用Perl编写Unicode(UCS-2 Little Endian)文件,如下所示。

    open my $f, ">$fName" or die "can't write $fName\n";
    binmode $f, ':raw:encoding(UCS-2LE)';
    print $f, "ohai\ni can haz unicodez?\nkthxbye\n";
    close $f;
    

    3 回复  |  直到 14 年前
        1
  •  2
  •   dsolimano    14 年前

    这在windows上对我有效:

    open my $f, ">:encoding(UCS-2LE):crlf", "test.txt";
    print $f "ohai\ni can haz unicodez?\nkthxbye\n";
    close $f;
    

    在的test.txt中生成UCS-16 LE输出

    ohai
    i can haz unicodez?
    kthxbye
    
        2
  •  2
  •   mob    14 年前

    :crlf 层执行简单的0x0A字节映射->0x0D 0x0A( \n --> \r\n )在输出流中,但在大多数情况下,这在任何宽字符编码中都无效。

    print $f "ohai\r\ni can haz unicodez?\r\nkthxbye\r\n";
    

    或者,如果考虑到可移植性,请发现并明确使用正确的行尾:

    ## never mind - $/ doesn't work
    # print $f "ohai$/i can haz unicodez?$/kthxbye$/";
    
    open DUMMY, '>', 'dummy'; print DUMMY "\n"; close DUMMY;
    open DUMMY, '<:raw', 'dummy'; $EOL = <DUMMY>; close DUMMY;
    unlink 'dummy';
    
    ...
    
    print $f "ohai${EOL}i can haz unicodez?${EOL}kthxbye${EOL}";
    
        3
  •  1
  •   szabgab Brandon Fosdick    10 年前

    以下是我发现的工作原理,至少在Perl5.10.1中是这样的:

    输入:

    open(my $f_in, '<:raw:perlio:via(File::BOM):crlf', $file);
    

    输出:

    open(my $f_out, '>:raw:perlio:encoding(UTF-16LE):crlf:via(File::BOM)', $file);
    

    它们透明地处理BOM、CRLF转换和UTF-16LE编码/解码。

    注意,根据下面的perlmonks文章,如果试图用binmode()而不是open()来指定,则需要额外的“:pop”:

    binmode $f_out, ':raw:pop:perlio:encoding(UTF-16LE):crlf';
    

    参考文献:

    http://www.perlmonks.org/?node_id=608532

    http://metacpan.org/pod/File::BOM