Perl UTF-8
最近使用 XML::Simple 剖析 UTF-8 編碼的 XML 檔, 結果讀出來的中文碼與 DB 取出來的無法對應, 才發現是 utf8 的問題.
以下是試出來的方法.. 至於為何會用 decode 而不是 encode 我也沒有仔細去探究原因..
- 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); }