首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl:打开与输入文件相同的输出文件-UTF-16 in和UTF-16 in。

Perl:打开与输入文件相同的输出文件-UTF-16 in和UTF-16 in。
EN

Stack Overflow用户
提问于 2015-03-04 14:30:42
回答 1查看 129关注 0票数 1

当Perl打开一个UTF-16编码文件时,

open my $in, "< :encoding(UTF-16)", "text-utf16le.txt" or die "Error $!\n";

它自动检测恩典字节顺序标记

但是当我打开文件写

open my $out, "> :encoding(UTF-16)", "output.txt" or die "Error $!\n";

默认情况下,Perl以大endian的形式打开它。

请指定以与输入文件相同的权限打开输出文件?

如何从输入文件句柄$in获得endianness/编码?PerlIO::get_layers($in)返回其他层encoding(UTF-16)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-04 15:14:01

你得自己读BOM。

代码语言:javascript
复制
use IO::Unread qw( unread );

open(my $fh_in, "<:raw", $qfn)
   or die;

my $rv = read($fh_in, my $buf, 4);
defined($rv)
   or die;

my $encoding;
my $bom_present;
if    ($buf =~ s/^\x00\x00\xFE\xFF//) { $encoding = 'UTF-32be'; $bom_present = 1; }
elsif ($buf =~ s/^\xFF\xFE\x00\x00//) { $encoding = 'UTF-32le'; $bom_present = 1; }
elsif ($buf =~ s/^\xFE\xFF//        ) { $encoding = 'UTF-16be'; $bom_present = 1; }
elsif ($buf =~ s/^\xFF\xFE//        ) { $encoding = 'UTF-16le'; $bom_present = 1; }
elsif ($buf =~ s/^\xEF\xBB\xBF//    ) { $encoding = 'UTF-8';    $bom_present = 1; }
else {
   $encoding = 'UTF-8';
   $bom_present = 0;
}

unread($fh_in, $buf) if length($buf);

binmode($fh_in, ":encoding($encoding)");
binmode($fh_in, ":crlf") if $^O eq 'MSWin32';

但已经有人为你这么做了

代码语言:javascript
复制
use File::BOM qw( open_bom );

my $encoding = open_bom(my $fh_in, $qfn, ':encoding(UTF-8)');
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28857025

复制
相关文章

相似问题

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