2011-09-14 11 views
8

Piszę plik CSV za pomocą Perla. Dane przechodzące do pliku CSV zawierają znaki Unicode. Używam następujące napisać CSV z:Siła UTF-8 bajtów Mark Mark w pliku wyjściowym Perl

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

To jest pisanie znaków prawidłowo wewnątrz pliku, ale nie wydaje się być tym UTF8 Byte Order Mark. To z kolei powoduje, że moi użytkownicy próbują otworzyć plik w Excelu. Czy istnieje sposób na wymuszenie zapisu Znaku porządkowania bajtów?

próbowałem go w następujący sposób:

print $fh "\x{EFBBBF}; 

skończyło się bełkotem na początku pliku. Każda pomoc będzie bardzo ceniona.

+2

"Znak porządku bajtów" dla UTF-8 nie ma żadnego logicznego sensu - istnieje tylko jedna możliwa kolejność bajtów dla UTF8. Jestem świadomy, że różne aplikacje dla Windows polegają na obecności "BOM", aby uruchomić kodowanie Unicode zamiast strony kodowej Microsoft, ale jeśli nie masz do czynienia z uszkodzonymi aplikacjami MS, nie ma żadnej wartości w dodawaniu LM do Dokument UTF8. –

+0

@Grant: Albo, aby być pedantycznym: Ponieważ UTF-8 koduje jako strumień bajtów, istnieje * nie * kolejność bajtów. Kolejność bajtów (lub Endianness) ma sens tylko dla liczb wielobajtowych. – musiKk

+1

@ Grant Zasadniczo zgadzam się z Tobą. Jednak moi użytkownicy używają uszkodzonych aplikacji MS. Stąd potrzeba wymuszenia BOM. –

Odpowiedz

13

spróbować zrobić to:

print $fh chr(65279); 

po otwarciu pliku.

+0

Zrobiłem to! Dzięki! –

+8

'print $ fh chr (0xFEFF);' będzie bardziej przejrzysty. –

+8

'użyj pliku :: BOM(); otwórz moje $ fh, '>: utf8: via (File :: BOM)', ... 'będzie jeszcze bardziej czytelnikiem. – daxim

Powiązane problemy