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

發信人: FenRagwort (澤), 信區: Perl
標  題: Perl實用中文處理步驟(修改版)
發信站: 水木社區 (Mon Feb 14 12:52:14 2011), 轉信

(修改版 感謝Invader)

0、你至少得知道編碼是怎麼回事,utf-八、gbk是什麼意思
  你的文本編輯器能顯示一個文件是什麼編碼,
      否則你要處理中文文件,都不知道用什麼編碼打開
  不過通常就是gbk和utf8兩種,實在不行兩個都試一遍
  注意也許你看到的不是gbk,而是gb2312,
      這兩個使用上實際是同樣的,gbk徹底包含gb2312

一、讓你的腳本文件自己用utf8保存,最好養成寫任何腳本都用utf8的習慣

二、腳本開頭加上:
  use utf8;
  use open ":encoding(gbk)", ":std";
  意思是腳本里的字符串都用utf8處理,可是標準輸入輸出用gbk(默認的代碼頁編碼)
  作到這一步,腳本里就能夠直接用中文了,字符串、正則表達式都沒問題

  若是要打開的文件所有是一種編碼,如utf8,則能夠加上:
  use open ":encoding(utf8)"; #若是文件全是gbk,那麼承上編碼設置,此行可省略

3.一、打開內有中文的文件前,先要肯定它的編碼,
       最多見是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.二、也能夠先打開文件,馬上再用binmode綁定編碼
  open my $fh, "file.txt" or die;
  binmode($fh, ":encoding(gbk)");
  通常狀況,直接在open裏指定encoding便可,有時須要先接收數據,再binmode

四、若是你的文件名是中文,有點麻煩,得這樣:
  use Encode qw/encode/;
  my $file = "2011年工做記錄.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) { # $file若print出來可能有亂碼,可是無妨
      open my $fh, "<:encoding(gbk)", $file or die;
      # 假定全部文件都是gbk編碼,若是你甲文件是gbk,乙是utf8,
      # 那就有點麻煩,這裏簡化下問題
      while (<$fh>) {
          print;
      }
  }


【 在 gimp (浪子已回頭) 的大做中提到: 】
: 我的寫的一些perl學習總結(比較粗淺)
: 個人工做是作搜索引擎方面的,
: 常常須要對索引數據作必定的預處理和後處理
: ...................
正則表達式

相關文章
相關標籤/搜索