差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

下次修改
前次修改
tech:perl_utf8 [2008/11/11 18:05] – 建立 jonathantech:perl_utf8 [2008/12/19 12:04] (目前版本) jonathan
行 1: 行 1:
 +====== 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 內建版本
 +
 +<code perl>
 +#!/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");
 +
 +</code>
 +
 +<note>
 +  * 剛剛想到, 與其這堆非 XML::Simple 的變數在 decode 不如直接將 $xml_str encode.. 如以下的程式碼
 +  * 為何之前一直在 encode / decode 繞圈圈, 主要是因為透過 utf8::is_utf8($xml_str) 為 true, 其餘都的是 false, 也因此對於已經是 utf8 還要再 encode 一次感到不解..
 +  * 後來發現, 真的有時候的預期與實際出現不同, 所以再寫一個 to_utf8() 來自動判別 decode
 +</note>
 +
 +
 +<code perl>
 +#!/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);
 +}
 +</code>
 +
 +
 +
 +===== 參考網頁 =====
 +  * http://perldoc.perl.org/utf8.html
 +
 +{{tag>perl utf8 xml::simple}}