2012年5月23日 星期三

Perl script to get MSSQL 2008 rows with Chinese (UTF8)

Reference:
http://blog.wu-boy.com/2009/07/perl-with-utf-8-mode/
http://www.jeffhung.net/blog/articles/jeffhung/417/

Perl output error message:
Wide character in print at test.pl line xx.

Root Cause:
Perl script 如果用一般的 ANSI 編碼格式儲存,輸出時也會是 ANSI 的格式。我從 MSSQL 2008 讀出的資料含有 UTF8 的中文字,print UTF8 data to STDOUT 會產生錯誤訊息。

Solution:
1. 將 test.pl 另存為 UTF-8 編碼格式
2. 在 test.pl 加上這幾行

use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');

這樣就可以正常印出 UTF8 的資料了。

另外,發現 ActivePerl 5.14.2 的 use Win32::ODBC; 對於 MSSQL 2008 UTF8 資料似乎會發生問題。改用 use DBI; 才正確取得資料。

MSSQL連線方式請參考這一篇

2016/2/17 update:
原本的 perl script 在 Windows 2003 (32bit) 運作正常,移到 Windows 2008 (64bit) 後會有 Wide character in syswrite 的錯誤。
解法:(參考這一篇)
1. 取消這四行
use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');
2. 加上
use Encode qw(encode);
3. 將 UTF-8 的資料編碼
$MA002 = encode("utf8", $result[1]);

沒有留言:

張貼留言