python中的代碼編碼格式轉(zhuǎn)換問(wèn)題
剛來(lái)這個(gè)公司,熟悉了環(huán)境,老大就開始讓我做一個(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.py import os import sys def 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 "[成功:]"+_file def 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 0 if __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)單
./changeEncode.py target_dir fromEncode toEncode
這里要注意下,幾種常見編碼的關(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)容了,希望大家能夠喜歡。
- python實(shí)現(xiàn)txt文件格式轉(zhuǎn)換為arff格式
- python實(shí)現(xiàn)m3u8格式轉(zhuǎn)換為mp4視頻格式
- Python將圖片批量從png格式轉(zhuǎn)換至WebP格式
- Python實(shí)現(xiàn)把json格式轉(zhuǎn)換成文本或sql文件
- 在Python的struct模塊中進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換的方法
- python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法
- python輕松實(shí)現(xiàn)代碼編碼格式轉(zhuǎn)換
- python實(shí)現(xiàn)批量圖片格式轉(zhuǎn)換
相關(guān)文章
python的scrapy框架之Pipeline文件的用法詳解
這篇文章主要介紹了python的scrapy框架之Pipeline文件的用法詳解,Pipeline是一個(gè)獨(dú)立的模塊,用于處理從Spider中提取的Item對(duì)象,實(shí)現(xiàn)對(duì)數(shù)據(jù)的進(jìn)一步處理、存儲(chǔ)和清洗等操作,下面將詳細(xì)介紹Scrapy框架中Pipeline的用法,需要的朋友可以參考下2023-10-10Python數(shù)據(jù)可視化JupyterNotebook繪圖生成高清圖片
這篇文章主要為大家介紹了Python數(shù)據(jù)可視化中如何利用Jupyter Notebook繪圖生成高清圖片,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09keras訓(xùn)練淺層卷積網(wǎng)絡(luò)并保存和加載模型實(shí)例
這篇文章主要介紹了keras訓(xùn)練淺層卷積網(wǎng)絡(luò)并保存和加載模型實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07詳解Python并發(fā)編程之從性能角度來(lái)初探并發(fā)編程
這篇文章主要介紹了詳解Python并發(fā)編程之從性能角度來(lái)初探并發(fā)編程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08對(duì)python append 與淺拷貝的實(shí)例講解
今天小編就為大家分享一篇對(duì)python append 與淺拷貝的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05PyTorch中torch.utils.data.DataLoader實(shí)例詳解
torch.utils.data.DataLoader主要是對(duì)數(shù)據(jù)進(jìn)行batch的劃分,下面這篇文章主要給大家介紹了關(guān)于PyTorch中torch.utils.data.DataLoader的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Python turtle庫(kù)繪制菱形的3種方式小結(jié)
今天小編就為大家分享一篇Python turtle庫(kù)繪制菱形的3種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11基于Python編寫簡(jiǎn)易文字語(yǔ)音轉(zhuǎn)換器
這篇文章主要為大家介紹了如何利用Python編寫一個(gè)簡(jiǎn)易文字語(yǔ)音轉(zhuǎn)換器,并打包成exe。文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起嘗試一下2022-03-03