====== Perl UTF-8 ======
最近使用 [[tech:perl:xml_simple]] 剖析 UTF-8 編碼的 XML 檔, 結果讀出來的中文碼與 DB 取出來的無法對應, 才發現是 utf8 的問題.
以下是試出來的方法.. 至於為何會用 decode 而不是 encode 我也沒有仔細去探究原因.. LOL
* perl 版本 : 5.8.8 (x86_64-linux-thread-multi) <- CentOS 5.2 內建版本
#!/usr/bin/perl
use XML::Simple qw(:strict);
use utf8;
:
:
# $db_str <- 這是由資料庫中取得的資料.
# $v_str <- 這是在程式中定義的變數
# $xml_str <- 這是透過 XML::Simple 取得的 xml 內資料
$x = "[$db_str][$v_str][$xml_str]"; # $x 印出後會出現亂碼.
print("x=$x\n");
utf8::decode($db_str);
utf8::decode($v_str);
$y = "[$db_str][$v_str][$xml_str]"; # $y 印出後可以正常顯示.
print("y=$y\n");
* 剛剛想到, 與其這堆非 XML::Simple 的變數在 decode 不如直接將 $xml_str encode.. 如以下的程式碼
* 為何之前一直在 encode / decode 繞圈圈, 主要是因為透過 utf8::is_utf8($xml_str) 為 true, 其餘都的是 false, 也因此對於已經是 utf8 還要再 encode 一次感到不解..
* 後來發現, 真的有時候的預期與實際出現不同, 所以再寫一個 to_utf8() 來自動判別 decode
#!/usr/bin/perl
use XML::Simple qw(:strict);
use utf8;
:
:
# $db_str <- 這是由資料庫中取得的資料.
# $v_str <- 這是在程式中定義的變數
# $xml_str <- 這是透過 XML::Simple 取得的 xml 內資料
$x = "[$db_str][$v_str][$xml_str]"; # $x 印出後會出現亂碼.
print("x=$x\n");
$xml_str=to_utf8($xml_str);
$y = "[$db_str][$v_str][$xml_str]"; # $y 印出後可以正常顯示.
print("y=$y\n");
# 轉成 utf8
sub to_utf8 {
local($p_str) = @_;
if (utf8::is_utf8($p_str)){
utf8::decode($p_str);
}
return($p_str);
}
===== 參考網頁 =====
* http://perldoc.perl.org/utf8.html
{{tag>perl utf8 xml::simple}}