perl編碼轉換

2021-08-25 15:52:23 字數 2626 閱讀 2202

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編碼來表示字元,也就是說對中文以及其他語言字元的處理應該是完全沒有問題的。我們只需要利用好encode這個模組便能充分發揮perl的utf8字元的優勢了。

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

useencode; 

$dat

=」測試文字」;

$str

=decode

(」gb2312″,$dat);

@chars

=split

//,$str;

foreach$char(@chars)

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

這裡主要用到了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編碼的檔案這裡只轉換第一行做個測試

my$str

=<

infile

>

my$enc

=guess_encoding

($str);

if(ref$enc)else

from_to($str,$from,$to);

printstdout"theteststringis:$str";

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

公升級 perl 模組 以及編碼轉換

perl mcpan e shell install uri escape 編碼轉換 use encode gbk轉uft 8 line encode utf 8 decode gbk line 或 line encode utf8 decode gbk line utf 8轉gbk line en...

perl位址轉換

usr bin perl w 將十進位制數轉換成8為二進位制 sub dectobin 將32位二進位制轉換成十進位制 sub bintodec 將二進位制表示的 ip 子網掩碼轉換成十進位制形式 sub ipmask bin2dec split shift return result 將十進位制表...

(編碼轉換)轉換檔案編碼

目錄 1 轉換編碼種類 2 轉編碼操作步驟 1 轉換編碼種類 可轉為 utf 8 最常用 ansi unicode unicode big endian 這四類編碼 2 轉換編碼操作步驟 1 將檔案以記事本方式開啟 注意 如果不可以請先將檔案轉換為 csv 檔案,再以記事本開啟 2 點選記事本左上方...