2011-09-14 13 views
8

Perl kullanarak bir CSV dosyası yazıyorum. CSV'ye giren veriler Unicode karakterleri içeriyor. Ben CSV dışarı yazmak için aşağıdaki kullanıyorum: dosya içindeki karakterleri düzgün bir yazıyor ama görünmüyorKuvvet UTF-8 Bayt Sırasıyla İşaretlemek Perl dosyası çıktısı

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

UTF8 Bayt al Mark dahil olmak. Bu da, dosyalarımı Excel'de açmaya çalışan kullanıcılarımı atar. Bayt Sırası Markasını yazılmaya zorlamanın bir yolu var mı?

print $fh "\x{EFBBBF}; 

ben dosyanın en üstünde anlamsız ile sona erdi:

ben o şu şekilde çalıştı. Herhangi bir yardım büyük takdir edilecektir. Bunu yaparken

+2

UTF-8 için bir 'Bayt Sırası İşareti' mantıksal bir anlam ifade etmez - UTF8 için yalnızca bir bayt sırası vardır. Çeşitli Windows uygulamalarının bir Microsoft kod sayfası yerine bir Unicode kodlamanın kullanılmasını tetiklemek için 'BOM'un varlığına güveniyor olduğunun farkındayım, ancak bozuk MS uygulamaları ile uğraşmıyorsanız, UTF8 belgesi. –

+0

@Grant: Ya da pedantic olmak için: UTF-8 bir bayt akışı olarak kodladığı için * no * bayt sırası vardır. Bayt sırası (veya Endianness) sadece çoklu bayt numaraları için anlamlıdır. – musiKk

+1

@Grant Prensip olarak sizinle aynı fikirdeyim. Ancak, kullanıcılarım kırık MS uygulamaları kullanıyor. Dolayısıyla BOM'u zorlama ihtiyacı. –

cevap

13

Dene: dosyayı açtıktan sonra

print $fh chr(65279); 

.

+0

Bu yaptı! Teşekkürler! –

+8

'print $ fh chr (0xFEFF);' daha açık olacaktır. –

+8

'File :: BOM() öğesini kullanın; $ fh, '>: utf8: open (Dosya :: BOM)' üzerinden…,… 'daha da açıklayıcı olur. – daxim