国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python中的代碼編碼格式轉(zhuǎn)換問(wèn)題

2019-11-25 17:17:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  剛來(lái)這個(gè)公司,熟悉了環(huán)境,老大就開(kāi)始讓我做一個(gè)遷移、修改代碼的工作,我想說(shuō)的是,這種工作真沒(méi)勁~~,看別人的代碼、改別人的代碼、這里改個(gè)變量、那里改個(gè)文件名??????,都是些沒(méi)技術(shù)含量、很繁瑣的事情,不過(guò)通過(guò)遷移代碼順便熟悉下環(huán)境也好。扯了這么多,說(shuō)說(shuō)今天的主題吧――代碼編碼格式改變,由于某些原因,需要將代碼從A機(jī)房遷移到B機(jī)房,這兩個(gè)之間不能互相訪問(wèn),但是歷史原因?qū)е翧機(jī)房的代碼全是utf8編碼的,B機(jī)房要求是GBK編碼,看看這個(gè)怎么解決。

編碼問(wèn)題

  先說(shuō)說(shuō)為什么會(huì)有編碼問(wèn)題,就拿上面那個(gè)例子來(lái)說(shuō),B機(jī)房這邊數(shù)據(jù)庫(kù)全是GBK編碼的,因此從數(shù)據(jù)庫(kù)中取出來(lái)的數(shù)據(jù)都是GBK的,從數(shù)據(jù)庫(kù)中取出來(lái)的數(shù)據(jù)是GBK編碼的,要在展示的時(shí)候不亂碼,在不對(duì)數(shù)據(jù)庫(kù)取出的數(shù)據(jù)轉(zhuǎn)換的情況下,就需要發(fā)送header的時(shí)候設(shè)置編碼為GBK,輸出的文件(html、tpl等)都必須是GBK的,看看下面這個(gè)圖會(huì)更清楚點(diǎn):

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

  或者還有一種方式只在出庫(kù)的時(shí)候在代碼中將utf8轉(zhuǎn)化為gbk,總的來(lái)說(shuō)utf8還是更流行點(diǎn),問(wèn)題更少點(diǎn)

    DB(GBK) => php等(utf8,并將從數(shù)據(jù)庫(kù)取出的數(shù)據(jù)轉(zhuǎn)化為utf8) => header(utf8) => html、tpl(utf8)

  只要按照上面這兩種規(guī)范編碼格式,就不會(huì)出現(xiàn)亂碼情況,起碼我測(cè)試的第一種方式是沒(méi)問(wèn)題的,所以我猜第二種也ok,好了,現(xiàn)在就來(lái)寫一個(gè)轉(zhuǎn)換文件編碼格式的小腳本:

#!/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 "[轉(zhuǎn)換失敗:]"+_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:"第一個(gè)參數(shù)不是一個(gè)有效的文件夾",3:"源編碼和目標(biāo)編碼相同",2:"您要轉(zhuǎn)化的編碼不再范圍之內(nèi):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)

  腳本很簡(jiǎn)單,使用也很簡(jiǎn)單

復(fù)制代碼 代碼如下:

  ./changeEncode.py target_dir fromEncode toEncode

  這里要注意下,幾種常見(jiàn)編碼的關(guān)系:

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

我試了下確實(shí)是的,在不加漢字的時(shí)候顯示編碼為us-ascii,加了漢字之后,變?yōu)閡tf-8。

  還有就是ASNI編碼格式,這代表是本地編碼格式,比如說(shuō)在簡(jiǎn)體中文操作系統(tǒng)下,ASNI編碼就代表GBK編碼,這點(diǎn)還需要注意

  還有一點(diǎn)就是一個(gè)在linux下查看文件編碼格式的命令是:

file -i *

  可以看到文件的編碼格式。

  當(dāng)然了,上面的可能有些文件中有特殊字符,處理的時(shí)候會(huì)失敗,但一般程序文件是沒(méi)有問(wèn)題的。

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 晋江市| 东乌| 太仆寺旗| 广德县| 新兴县| 惠东县| 新安县| 睢宁县| 石屏县| 长汀县| 衢州市| 广宁县| 道真| 安远县| 尼木县| 宜黄县| 南雄市| 大足县| 乌审旗| 靖边县| 绥芬河市| 邳州市| 博乐市| 油尖旺区| 错那县| 酒泉市| 通海县| 舒城县| 江川县| 苏州市| 黑水县| 台州市| 平远县| 柯坪县| 定州市| 西乌珠穆沁旗| 望城县| 凤山县| 安吉县| 和硕县| 松滋市|