2011-09-09 20 views
3

我對此很新穎,對大多數人來說這可能很容易,但我一直在爲此掙扎數日。如何使用perl存儲和顯示ISO-8859-1和UTF8字符

我在寫一個使用perl的web爬蟲,而web爬蟲將使用LWP和一些簡單的正則表達式來提取某些信息。

這些信息保存在一個mySQL數據庫中,該數據庫將用於android設備上。然而,當我測試網絡爬蟲時,我意識到一些信息使用HTML數字編碼(典 華),並且一些信息使用iso-8859-1編碼(Zhífú) 。 我使用PERL HTML :: Entities庫解析了中文零件,當我將控制檯設置爲utf8時,可以顯示它。但是,其他字母(Zhífú)只能在iso-8859-1中顯示。如果我試圖用utf8顯示它,它將變成Zh f 。我的問題是:

  1. 我怎麼能確定哪種類型的編碼用它的,我怎麼能顯示不同的看法?
  2. 我可以直接將它存儲在mySQL中,或者我應該先處理這些信息(如果我錯了,請糾正我,但我的理解是mySQL使用utf8作爲默認語言)。
  3. 當我將它顯示在android設備上時會造成某種問題嗎?

非常感謝。

回答

6
(Zhífú)只能在iso-8859-1中顯示。如果我試圖用utf8顯示它,它將變成Zh f 。

這完全是錯誤的。您可以在iso-8859-1和UTF-8終端/應用程序/任何內容中顯示「Zhífú」。事實上,你看到「Zhífú」的事實證明它可以用UTF-8顯示,因爲這是一個UTF-8網頁。如果你得到「Zh f 」,那是因爲你沒有在使用UTF-8將字符串編碼給終端/應用程序/任何需要UTF-8的字符串之前編碼。

無論如何,在這個問題上。我假設你正在存儲文本,而不是HTML。

解碼每個輸入!對每個輸出進行編碼!然後沒問題。

  From the web 
    5a 68 c3 ad 66 c3 ba 
       | 
      decode   Done for you by ->decoded_content (LWP::UA) 
       |   or by ->content (WWW::Mech) 
       v 

     Decoded text  Manipulate as desired 
      Zhífú 

       | 
      encode   Done for you by DBI 
       | 
       v 
      Database 
5a 68 c3 83 c2 ad 66 c3 83 c2 ba 

事實上,解碼應該已爲您做->decoded_content和編碼應該已爲您做DBI,所以我不明白爲什麼你有這個麻煩。

從數據庫讀取並輸出到屏幕/無論什麼時都是一樣的。

5a 68 c3 83 c2 ad 66 c3 83 c2 ba 
      Database 
       | 
      decode   Done for you by DBI if you use 
       |   the ..._utf8 flag for your driver 
       v 

     Decoded text  Manipulate as desired 
      Zhífú 

       | 
      encode   use open ':std', ':locale'; 
       | 
       v 
      Screen 
5a 68 c3 83 c2 ad 66 c3 83 c2 ba 
+0

感謝您的幫助,但是,我意識到問題出在HTML :: Entities :: decode_entities函數中。只要字符串包含HTML數字編碼(典),字符串(Zhífú)的其餘部分就會在decode_entities後正確顯示。但是,如果字符串不包含HTML數字編碼,則字符串將顯示爲Zh f 。 – hook38

+0

@ user898378,'decode_entities'沒有問題。您現在描述的內容表明您在程序中的某個位置沒有正確編碼輸出。請注意,當我說「解碼」和「編碼」時,我指的是字符編碼,如在Encode :: encode和Encode :: decode或等價物中。 – ikegami