首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法使用Text::CSV_XS Perl模块写入UTF-16LE编码的CSV文件

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

Stack Overflow用户
提问于 2014-11-06 02:08:22
回答 1查看 567关注 0票数 1

我想写一个用UTF-16LE编码的CSV文件。但是,文件中的输出会变得混乱。有一些看起来奇怪的中文字母:਍挀攀氀氀㄀⸀㄀㬀挀攀氀氀㄀⸀㈀㬀ഀ。

这看起来像这里提到的单字节问题:Creating UTF-16 newline characters in Python for Windows Notepad

其他关于Perl和Text::CSV_XS的帖子也帮不上忙。

这是我尝试的方法:

代码语言:javascript
复制
#!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编码:

代码语言:javascript
复制
header1;header2;
cell1.1;cell1.2;
äöü2.1;ab"c2.2;

结果如下所示:

代码语言:javascript
复制
header1;header2;਍挀攀氀氀㄀⸀㄀㬀挀攀氀氀㄀⸀㈀㬀ഀ
æöü2.1;abc2.2;਍

不能选择切换到UTF-8作为输出格式(顺便说一下,它工作得很好)。

那么,如何使用Text::CSV_XS编写有效的UTF16LE编码的CSV文件呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-06 02:38:39

默认情况下,Perl会在Windows上添加:crlf。它是先添加的,在添加:encoding之前。

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

它最终使用UTF-8,尽管是向后完成的,因为满足了以下所有条件:

  • LF的UTF-8编码与其代码点(0A)相同。
  • CR的UTF-8编码与其代码点(0D)相同。
  • 0A始终引用LF,无论它们位于文件中的何处。
  • 0D始终引用CR,无论它们位于文件中的何处。

< Code >F211

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

修复:

代码语言:javascript
复制
open(my $fh_in,  '<:raw:encoding(UTF-16LE):crlf', $qfn_in)
open(my $fh_out, '>:raw:encoding(UTF-16LE):crlf', $qfn_out)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26764098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档