perl編碼轉換

來源:互聯網
上載者:User

gb2312轉Utf8的方法:
use Encode;
my $str = "中文";
$str_cnsoftware = encode("utf-8", decode("gb2312", $str));
 
Utf8轉gb2312的方法:
use Encode;
my $str = "utf8中文";
$str_cnsoftware = encode("gb2312", decode("utf-8", $str);

或用

use Encode;

 Encode::from_to($octets, "iso-8859-1", "cp1250");

 

 

 

 

本文和大家重點討論一下Perl不同編碼之間的變換,Perl從5.6開始已經開始在內部使用utf8編碼來表示字元,也就是說對中文以及其他語言字元的處理應該是完全沒有問題的。

Perl不同編碼之間的變換

Perl從5.6開始已經開始在內部使用utf8編碼來表示字元,也就是說對中文以及其他語言字元的處理應該是完全沒有問題的。我們只需要利用好Encode這個模組便能充分發揮Perl的utf8字元的優勢了。

下面就以中文文本的處理為例進行說明,比如有一個字串”測試文本”,我們想要把這個中文字串拆成單個字元,可以這樣寫:

 

 
  1. useEncode;  
  2. $dat=”測試文本”;  
  3. $str=decode(”gb2312″,$dat);  
  4. @chars=split//,$str;  
  5. foreach$char(@chars){  
  6. printencode(”gb2312″,$char),”/n”;  
  7. }  

 

結果大家試一試就知道了,應該是令人滿意的。

這裡主要用到了Encode模組的decode、encode函數。要瞭解這兩個函數的作用我們需要清楚幾個概念:

1、Perl字串是使用utf8編碼的,它由Unicode字元組成而不是單個位元組,每個utf8編碼的Unicode字元佔1~4個位元組(變長)。

2、進入或離開Perl處理環境(比如輸出到螢幕、讀入和儲存檔案等等)時不是直接使用Perl字串,而需要把Perl字串轉換成位元組流,轉換過程中使用何種編碼方式完全取決於你(或者由Perl代勞)。一旦Perl字串向位元組流的編碼完成,字元的概念就不存在了,變成了純粹的位元組組合,如何解釋這些組合則是你自己的工作。

我們可以看出如果想要Perl按照我們的字元概念來對待文本,文本資料就需要一直用Perl字串的形式存放。但是我們平時寫出的每個字元一般都被作為純ASCII字元儲存(包括在程式中明文寫出的字串),也就是位元組流的形式,這裡就需要encode和decode函數的協助了。

encode函數顧名思義是用來編碼Perl字串的

它將Perl字串中的字元用指定的編碼格式編碼,最終轉化為位元組流的形式,因此和Perl處理環境之外的事物打交道經常需要它。其格式很簡單:
$octets=encode(ENCODING,$string[,CHECK])

$string:Perl字串
encoding: 是給定的編碼方式
$octets:是編碼之後的位元組流
check: 表示轉換時如何處理畸變字元(也就是Perl認不出來的字元)。一般不需使用編碼方式視語言環境的不同有很大變化,預設可以識別utf8、ascii、ascii-ctrl、iso-8859-1等。

decode函數則是用來解碼位元組流的

它按照你給出的編碼格式解釋給定的位元組流,將其轉化為使用utf8編碼的Perl字串,一般來說從終端或者檔案取得的文本資料都應該用decode轉換為Perl字串的形式。它的格式為:
$string=decode(ENCODING,$octets[,CHECK])
$string、ENCODING、$octets和CHECK的含義同上。

現在就很容易理解上面寫的那段程式了。因為字串是用明文寫出的,存放的時候已經是位元組流形式,喪失了本來的意義,所以首先就要用decode函數將其轉換為Perl字串,由於漢字一般都用gb2312格式編碼,這裡decode也要使用gb2312編碼格式。轉換完成後Perl對待字元的行為就和我們一樣了,平時對字串進行操作的函數基本上都能正確對字元進行處理,除了那些本來就把字串當成一堆位元組的函數(如vec、pack、unpack等)。於是split就能把字串切成單個字元了。最後由於在輸出的時候不能直接使用utf8編碼的字串,還需要將切割後的字元用encode函數編碼為gb2312格式的位元組流,再用print輸出。

另外,還可以用下面的方法來"猜"出字串的編碼.但我試過,也不是每次都管用.
useEncodeqw/from_to/;
useEncode::Guessqw/euc-jpshiftjis/;

openINFILE"....";#輸入的檔案是SHIFT-JIS編碼的檔案這裡只轉換第一行做個測試
 

 
  1. my$str=<INFILE> 
  2. my$enc=guess_encoding($str);  
  3. if(ref$enc){  
  4. $from=$enc->name;  
  5. }else{  
  6. $from="shiftjis";  
  7. }  
  8.  
  9. from_to($str,$from,$to);  
  10. printSTDOUT"ThetestStringis:$str";  
  11.  

當輸入檔案行紀錄是日文漢字開頭的時候,是可以判斷出來編碼類別型是shift-jis的.但是當開頭是一組資料再加個逗號之類的資料時,就猜不到了.原因還不是很明確.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.