標籤

4GL (1) 人才發展 (10) 人物 (3) 太陽能 (4) 心理 (3) 心靈 (10) 文學 (31) 生活常識 (14) 光學 (1) 名句 (10) 即時通訊軟體 (2) 奇狐 (2) 音樂 (2) 產業 (5) 郭語錄 (3) 無聊 (3) 統計 (4) 新聞 (1) 經濟學 (1) 經營管理 (42) 解析度 (1) 遊戲 (5) 電學 (1) 網管 (10) 廣告 (1) 數學 (1) 機率 (1) 雜趣 (1) 證券 (4) 證券期貨 (1) ABAP (15) AD (1) agentflow (4) AJAX (1) Android (1) AnyChart (1) Apache (14) BASIS (4) BDL (1) C# (1) Church (1) CIE (1) CO (38) Converter (1) cron (1) CSS (23) DMS (1) DVD (1) Eclipse (1) English (1) excel (5) Exchange (4) Failover (1) FI (57) File Transfer (1) Firefox (2) FM (2) fourjs (1) gladiatus (1) google (1) Google Maps API (2) grep (1) Grub (1) HR (2) html (23) HTS (8) IE (1) IE 8 (1) IIS (1) IMAP (3) Internet Explorer (1) java (3) JavaScript (22) jQuery (6) JSON (1) K3b (1) LED (3) Linux (112) Linux Mint (4) Load Balance (1) Microsoft (2) MIS (2) MM (51) MSSQL (1) MySQL (27) Network (1) NFS (1) Office (1) Oracle (125) Outlook (3) PDF (6) Perl (59) PHP (33) PL/SQL (1) PL/SQL Developer (1) PM (3) Postfix (2) postfwd (1) PostgreSQL (1) PP (50) python (1) QM (1) Red Hat (4) Reporting Service (28) ruby (11) SAP (234) scp (1) SD (16) sed (1) Selenium-WebDriver (5) shell (5) SQL (4) SQL server (8) SQuirreL SQL Client (1) SSH (2) SWOT (3) Symantec (2) T-SQL (7) Tera Term (2) tip (1) tiptop (22) Tomcat (6) Trouble Shooting (1) Tuning (5) Ubuntu (33) ufw (1) utf-8 (1) VIM (11) Virtual Machine (2) vnc (3) Web Service (2) wget (1) Windows (19) Windows (1) WM (6) youtube (1) yum (2)

2015年6月15日 星期一

如何讓excel讀取utf-8 編碼的csv檔案時,不會有亂碼?

其實如果以筆記本或類似UltraEdit打開時,不會是亂碼。
原因是excel 預設打開csv檔案,是用 ANSI編碼打開。
解決方式有二:
1. excel打開,menu->資料->從文字檔->選擇要打開的csv,選擇utf-8編碼開啟
2. 當初寫入csv時,開頭寫入utf-8 BOM(byte order mark)編碼如下(第45列)

  1 #!/usr/bin/perl
  2
  3 require "$ENV{HOME}/perl/setEnv.pl";
  4
  5 use MIME::QuotedPrint;
  6 use MIME::Base64;
  7 use Mail::Sendmail 0.75; # doesn't work with v. 0.74!
  8 use DBI;
  9 use utf8;
 10 use Encode;
 11
 12 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time-86400);
 13 $year += 1900;
 14 $mon += 1;
 15 $mon = sprintf("%02d", $mon);
 16
 17 %mail = (
 18          from => 'mis@echochem.com.tw',
 19          #to => 'tracy\@echochem.com.tw',
 20          to => "tyruan\@echochem.com.tw",
 21          subject => '客戶主檔'."$year/$mon"
 22         );
 23 $mail{smtp} = 'x.x.x.x'; #要改
 24
 25 $boundary = "====" . time() . "====";
 26 $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
 27
 28 #$message = encode_qp( "客戶主檔 $year/$mon 資料" );
 29 $message = encode_qp( "Customer Master Data $year/$mon " );
 30
 31 $file = $^X; # This is the perl executable
 32
 33 my $dbh = DBI->connect( "dbi:Oracle:$yyy", "$zzz", "$www" ) #要改
 34     || die( $DBI::errstr . "\n" );
 35 $dbh->{AutoCommit}    = 0;
 36
 37 my $sth = $dbh->prepare(qq{
 38 select rmnth,occ01,occ02,occ11,occ18,ta_occ09
 39   from axm_tbl_occ
 40  where rmnth = to_char(trunc(sysdate,'mm')-1,'yyyymm')
 41 });
 42 $sth->execute();
 43 chdir "$ENV{HOME}/perl/erp";
 44 open FILE, "> 客戶主檔.csv";
 45 print FILE chr(0xFEFF); 
      #print FILE pack("CCC",0xef,0xbb,0xbf);#也可以,
      #print FILE "\x{FEFF}"; #也可以,
      見http://stackoverflow.com/questions/7418946/force-utf-8-byte-order-mark-in-perl-file-output
 46 print FILE "資料月份,客戶代碼,客戶名稱,統一編號,客戶全名,業務區域\n";
 47 while(my @data = $sth->fetchrow_array()) {
 48    $data[2] =~ s/,//g;
 49    $data[4] =~ s/,//g;
 50    print FILE "$data[0],$data[1],$data[2],$data[3],$data[4],$data[5]\n";
 51 }
 52 close FILE;
 53 $sth->finish();
 54 $dbh->disconnect();
 55
 56 open (F, "< 客戶主檔.csv") or die "Cannot read $file: $!";
 57 binmode F; undef $/;
 58 my $body;
 59 while (my $line = <F>) {
 60    $body .= $line;
 61 }
 62 $mail{body} = encode_base64($body);
 63 close F;
 64 print $mail{body};
 65
 66 $boundary = '--'.$boundary;
 67 $mail{body} = <<END_OF_BODY;
 68 $boundary
 69 Content-Type: text/plain; charset="utf-8"
 70 Content-Transfer-Encoding: quoted-printable
 71
 72 $message
 73 $boundary
 74 Content-Type: application/octet-stream; name="客戶主檔.csv"
 75 Content-Transfer-Encoding: base64
 76 Content-Disposition: attachment; filename="客戶主檔.csv"
 77
 78 $mail{body}
 79 $boundary--
 80 END_OF_BODY
 81
 82 sendmail(%mail) || print "Error: $Mail::Sendmail::error\n";
 83

沒有留言:

張貼留言