无法使用Text :: CSV_XS Perl模块编写UTF-16LE编码的CSV文件

cap*_*fan 1 csv perl encoding

我想写一个用UTF-16LE编码的CSV文件.但是,文件中的输出搞砸了.有一些奇怪的中文字母:਍挀攀氀氀㄀⸀㄀挀挀攀氀氀㄀⸀㈀ഀഀ.

这看起来像这里提到的逐字节问题:在Python for Windows Notepad中创建UTF-16换行符

关于Perl和Text :: CSV_XS的其他主题没有帮助.

这是我尝试的方式:

#!perl

use strict;
use warnings;
use utf8;
use Text::CSV_XS;

binmode STDOUT, ":utf8";

my $csv = Text::CSV_XS->new({
    binary => 1,
    sep_char => ";",
    quote_char => undef,
    eol => $/,
});

open my $in, '<:encoding(UTF-16LE)', 'in.csv' or die "in.csv: $!";
open my $out, '>:encoding(UTF-16LE)', 'out.csv' or die "out.csv: $!";

while (my $row = $csv->getline($in)) {
    $_ =~ s/ä/æ/ for @$row; # something will be done to the data...
    $csv->print($out, $row);
}


close $in;
close $out;
Run Code Online (Sandbox Code Playgroud)

in.csv包含一些测试数据,它以UTF-16LE编码:

header1;header2;
cell1.1;cell1.2;
äöü2.1;ab"c2.2;
Run Code Online (Sandbox Code Playgroud)

结果如下:

header1;header2;??????????????????
æöü2.1;abc2.2;?
Run Code Online (Sandbox Code Playgroud)

不能选择切换到UTF-8作为输出格式(工作正常btw).

那么,如何使用Text :: CSV_XS编写有效的UTF-16LE编码CSV文件?

ike*_*ami 5

Perl :crlf默认在Windows上添加.在添加之前,首先:encoding添加它.

这意味着LF⇔CRLF转换将在读取解码之前和写入编码之后执行.这是倒退.

它最终使用UTF-8,尽管由于满足以下所有条件而向后执行:

  • LF的UTF-8编码与其代码点(0A)相同.
  • CR的UTF-8编码与其代码点(0D)相同.
  • 0A总是指LF,无论它们在文件中的什么位置.
  • 0D总是指CR,无论它们在文件中的什么位置.

这些条件都不适用于UTF-16le.

固定:

open(my $fh_in,  '<:raw:encoding(UTF-16LE):crlf', $qfn_in)
open(my $fh_out, '>:raw:encoding(UTF-16LE):crlf', $qfn_out)
Run Code Online (Sandbox Code Playgroud)