python輕鬆實現代碼編碼格式轉換

來源:互聯網
上載者:User
  最近剛換工作不久,沒太多的時間去整理工作中的東西,大部分時間都在用來熟悉新公司的業務,熟悉他們的代碼架構了,最主要的是還有很多新東西要學,我之前主要是做php後台開發的,來這邊之後還要把我半路出家的前端學好、還要學習C++,哈哈,總之很充實了,每天下班回家都可以睡的很香(一句話總結,就是吃得香、睡的香~)。再說說換工作時候吧,今年年初正式畢業半年了,感覺自己技術增長很快,原公司裡面程式員的地位還不如運營,所以想換個工作,面試了3家(2家大的、一家小的),都給offer了,當然從大公司裡面挑了個各方面綜合(工資、幹什麼、交通等等)還不錯的,反正感覺就很順利的進來了(比畢業的時候容易多了),哈哈,越努力、越幸運,越幸運、越努力!。從這周開始,繼續整理部落格,免得給自己造成懶得習慣。

  剛來這個公司,熟悉了環境,老大就開始讓我做一個遷移、修改代碼的工作,我想說的是,這種工作真沒勁~~,看別人的代碼、改別人的代碼、這裡改個變數、那裡改個檔案名稱······,都是些沒技術含量、很繁瑣的事情,不過通過遷移代碼順便熟悉下環境也好。扯了這麼多,說說今天的主題吧——代碼編碼格式改變,由於某些原因,需要將代碼從A機房遷移到B機房,這兩個之間不能互相訪問,但是曆史原因導致A機房的代碼全是utf8編碼的,B機房要求是GBK編碼,看看這個怎麼解決。

編碼問題
  先說說為什麼會有編碼問題,就拿上面那個例子來說,B機房這邊資料庫全是GBK編碼的,因此從資料庫中取出來的資料都是GBK的,從資料庫中取出來的資料是GBK編碼的,要在展示的時候不亂碼,在不對資料庫取出的資料轉換的情況下,就需要發送header的時候設定編碼為GBK,輸出的檔案(html、tpl等)都必須是GBK的,看看下面這個圖會更清楚點:

    DB(GBK) => php等(編碼格式不限但如果代碼檔案中有漢字,檔案就要是gbk編碼或者在漢字輸出的時候轉化為gbk) => header(GBK) => html、tpl(GBK)

  或者還有一種方式只在出庫的時候在代碼中將utf8轉化為gbk,總的來說utf8還是更流行點,問題更少點

    DB(GBK) => php等(utf8,並將從資料庫取出的資料轉化為utf8) => header(utf8) => html、tpl(utf8)

  只要按照上面這兩種規範編碼格式,就不會出現亂碼情況,起碼我測試的第一種方式是沒問題的,所以我猜第二種也ok,好了,現在就來寫一個轉換檔編碼格式的小指令碼:

#!/usr/bin/python# -*- coding: utf-8 -*-#Filename:changeEncode.pyimport osimport sysdef ChangeEncode(file,fromEncode,toEncode):  try:    f=open(file)    s=f.read()    f.close()    u=s.decode(fromEncode)    s=u.encode(toEncode)    f=open(file,"w");    f.write(s)    return 0;  except:    return -1;def Do(dirname,fromEncode,toEncode):  for root,dirs,files in os.walk(dirname):    for _file in files:      _file=os.path.join(root,_file)      if(ChangeEncode(_file,fromEncode,toEncode)!=0):        print "[轉換失敗:]"+_file      else:        print "[成功:]"+_filedef CheckParam(dirname,fromEncode,toEncode):  encode=["UTF-8","GBK","gbk","utf-8"]  if(not fromEncode in encode or not toEncode in encode):    return 2  if(fromEncode==toEncode):    return 3  if(not os.path.isdir(dirname)):    return 1  return 0if __name__=="__main__":  error={1:"第一個參數不是一個有效檔案夾",3:"源編碼和目標編碼相同",2:"您要轉化的編碼不再範圍之內:UTF-8,GBK"}  dirname=sys.argv[1]  fromEncode=sys.argv[2]  toEncode=sys.argv[3]  ret=CheckParam(dirname,fromEncode,toEncode)  if(ret!=0):    print error[ret]  else:    Do(dirname,fromEncode,toEncode)

  指令碼很簡單,使用也很簡單

複製代碼 代碼如下:


  ./changeEncode.py target_dir fromEncode toEncode


這裡要注意下,幾種常見編碼的關係:

  us-ascii編碼是utf-8編碼的一個子集,這個是從stackoverflow上得到的,原文如下ASCII is a subset of UTF-8, so all ASCII files are already UTF-8 encoded,

我試了下確實是的,在不加漢字的時候顯示編碼為us-ascii,加了漢字之後,變為utf-8。

  還有就是ASNI編碼格式,這代表是本地編碼格式,比如說在簡體中文作業系統下,ASNI編碼就代表GBK編碼,這點還需要注意

  還有一點就是一個在linux下查看檔案編碼格式的命令是:

複製代碼 代碼如下:


file -i *

  可以看到檔案的編碼格式。

  當然了,上面的可能有些檔案中有特殊字元,處理的時候會失敗,但一般程式檔案是沒有問題的。

以上就是本文所述的全部內容了,希望對大家學習python能夠有所協助。

請您花一點時間將文章分享給您的朋友或者留下評論。我們將會由衷感謝您的支援!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.