Perl實用中文處理步驟(修改版)

2022-07-29 15:12:14 字數 1947 閱讀 9536

發信人: fenragwort (澤), 信區: perl

標  題: perl實用中文處理步驟(修改版)

發信站: 水木社群 (mon feb 14 12:52:14 2011), 轉信

(修改版 感謝invader)

0、你至少得知道編碼是怎麼回事,utf-8、gbk是什麼意思

你的文字編輯器能顯示乙個檔案是什麼編碼,

不然你要處理中文檔案,都不知道用什麼編碼開啟

不過一般就是gbk和utf8兩種,實在不行兩個都試一遍

注意也許你看到的不是gbk,而是gb2312,

這兩個使用上實際是一樣的,gbk完全包含gb2312

1、讓你的指令碼檔案本身用utf8儲存,最好養成寫任何指令碼都用utf8的習慣

2、指令碼開頭加上:

use utf8;

use open ":encoding(gbk)", ":std";

意思是指令碼裡的字串都用utf8處理,但是標準輸入輸出用gbk(預設的**頁編碼)

做到這一步,指令碼裡就可以直接用中文了,字串、正規表示式都沒問題

如果要開啟的檔案全部是一種編碼,如utf8,則可以加上:

use open ":encoding(utf8)"; #如果檔案全是gbk,那麼承上編碼設定,此行可省略

3.1、開啟內有中文的檔案前,先要確定它的編碼,

最常見是gbk或utf8,台灣來的可能是big5,utf16le的偶有可能,其他較少見

這樣開啟:

open my $fh, "<:encoding(gbk)", "file.txt" or die; # 讀檔案

open my $fh, ">:encoding(utf8)", "file.txt" or die; # 寫檔案

# 如果上面設定了預設開啟編碼為utf8,則具體開啟檔案時可省掉":encoding(utf8)"

# 開啟別的編碼的檔案,還需顯式指定編碼

如果win32系統下開啟utf16le或be檔案,需要寫成:

open my $fh, "<:raw:encoding(utf16le):crlf", "file.txt" or die;

否則會有crlf轉換的bug

3.2、也可以先開啟檔案,立刻再用binmode繫結編碼

open my $fh, "file.txt" or die;

binmode($fh, ":encoding(gbk)");

一般情況,直接在open裡指定encoding即可,有時需要先接收資料,再binmode

4、如果你的檔名是中文,有點麻煩,得這樣:

use encode qw/encode/;

my $file = "2023年工作記錄.txt"; # 中英文數字混合檔名也沒問題

$file = encode("gbk", $file); # 檔名是通過標準輸出傳給命令列的,而命令列

# 的編碼是gbk,所以要編碼成gbk,保持一致

open my $fh, "<:encoding(gbk)", $file or die;

ok,中文問題搞定了,然後該幹嘛幹嘛,除了一些以位元組為物件的操作(如seek、pack),

你就把「甲乙丙丁」當「abcd」用吧,冇問題

x、附送小技巧:

如果你是批量處理文字檔案,那甚至可以不管中文檔名問題

比如要處理ch_files資料夾下的所有txt檔案(包含中文檔名),那麼

my @files = glob "ch_files/*.txt";

# 不過假如你的資料夾是帶中文的,那還是得把資料夾參照4轉碼

foreach my $file (@files)

}【 在 gimp (浪子已回頭) 的大作中提到: 】

: 個人寫的一些perl學習總結(比較粗淺)

: 我的工作是做搜尋引擎方面的,

: 經常需要對索引資料做一定的預處理和後處理

: ...................

perl處理中文

perl從5.6開始已經開始在內部使用utf8編碼來表示字元,也就是說對中文以及其他語言字元的處理應該是完全沒有問題的。我們只需要利用好encode這個模組便能充分發揮perl的utf8字元的優勢了。下面就以中文文字的處理為例進行說明,比如有乙個字串 測試文字 我們想要把這個中文字串拆成單個字元,可...

Perl中文編碼的處理

在perl內部,字串結構由兩部分組成 資料和utf8 flag.例如 utf8 flag 資料 on 中文 如果utf8 flag為on的話,perl就會把 中文 當成utf8字串來處理,如果utf8 flag為off,perl就會把他當成octets來處理.所有字串相關的函式包括正規表示式都會受u...

Perl對中文的處理 encode,decode

perl對中文的處理 encode,decode 最近在處理中文時遇到亂碼的問題,google了一下,發現下面這篇文章。茅塞頓開!perl從5.6開始已經開始在內部使用utf8編碼來表示字元,也就是說對中文以及其他語言字元的處理應該是完全沒有問題的。我們只需要利用好encode這個模組便能充分發揮p...