我想写一个用UTF-16LE编码的CSV文件。但是,文件中的输出会变得混乱。有一些看起来奇怪的中文字母:挀攀氀氀⸀㬀挀攀氀氀⸀㈀㬀ഀ。
这看起来像这里提到的单字节问题:Creating UTF-16 newline characters in Python for Windows Notepad
其他关于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;
in.csv包含一些测试数据,并以UTF-16LE编码:
header1;header2;
cell1.1;cell1.2;
äöü2.1;ab"c2.2;
结果如下所示:
header1;header2;挀攀氀氀⸀㬀挀攀氀氀⸀㈀㬀ഀ
æöü2.1;abc2.2;
不能选择切换到UTF-8作为输出格式(顺便说一下,它工作得很好)。
那么,如何使用Text::CSV_XS编写有效的UTF16LE编码的CSV文件呢?
发布于 2014-11-06 02:38:39
默认情况下,Perl会在Windows上添加:crlf
。它是先添加的,在添加:encoding
之前。
这意味着LF⇔CRLF转换将在读取解码之前和写入编码之后执行。这是倒退的。
它最终使用UTF-8,尽管是向后完成的,因为满足了以下所有条件:
< Code >F211
这些条件都不适用于UTF-16le。
修复:
open(my $fh_in, '<:raw:encoding(UTF-16LE):crlf', $qfn_in)
open(my $fh_out, '>:raw:encoding(UTF-16LE):crlf', $qfn_out)
https://stackoverflow.com/questions/26764098
复制相似问题