我想写一个用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文件?
Perl :crlf默认在Windows上添加.在添加之前,首先:encoding添加它.
这意味着LF⇔CRLF转换将在读取解码之前和写入编码之后执行.这是倒退.
它最终使用UTF-8,尽管由于满足以下所有条件而向后执行:
这些条件都不适用于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)
| 归档时间: |
|
| 查看次数: |
386 次 |
| 最近记录: |