2011-09-14 19 views
8

我正在使用Perl写出一个CSV文件。进入CSV的数据包含Unicode字符。我使用的是下面写的CSV出来:在Perl文件输出中强制使用UTF-8字节顺序标记

#OPEN THE FILE FOR WRITE 
open(my $fh, ">:utf8", "rpt-".$datestring.".csv") 
or die "cannot open < rpt.csv: $!"; 

即正确地书写文字里面的文件,但似乎并没有被包括UTF8字节顺序标记。这反过来会抛出我的用户试图在Excel中打开文件。有没有办法强制字节顺序标记写入?

我尝试过通过以下方式:

print $fh "\x{EFBBBF}; 

我结束了乱码的文件的顶部。任何帮助将不胜感激。

+2

UTF-8的'Byte Order Mark'没有任何合理性 - UTF8只有一个可能的字节顺序。我知道,各种Windows应用程序依赖于“BOM”的存在来触发使用Unicode编码而不是Microsoft代码页,但如果您不处理损坏的MS应用程序,则向BOM添加BOM没有任何价值UTF8文件。 –

+0

@Grant:或者,要迂回:由于UTF-8编码为字节流,所以* no *字节顺序。字节顺序(或字节顺序)仅适用于多字节数字。 – musiKk

+1

@格兰特原则上,我同意你的看法。但是我的用户正在使用破碎的MS应用程序因此需要强制BOM。 –

回答

13

尝试这样做:

print $fh chr(65279); 

打开该文件后。

+0

这样做了!谢谢! –

+8

'print $ fh chr(0xFEFF);'会更清晰。 –

+8

'使用File :: BOM();打开我的$ fh,'>:utf8:via(File :: BOM)',...'会更加清晰。 – daxim

相关问题