使用者工具

網站工具


tech:perl_utf8

Perl UTF-8

最近使用 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);
}

參考網頁

tech/perl_utf8.txt · 上一次變更: 2008/12/19 12:04 由 jonathan