แปลงไฟล์ จาก tis620 เป็น utf8

วันนี้มีงานต้องแปลงไฟล์ จาก tis620 ไป utf8
คำสั่งที่ต้องใช้คือ
$ iconv -f tis620 -t utf8 -o NEWFILE.TXT OLDFILE.TXT

แต่ปัญหาคือหลายไฟล์แปลงไม่ได้ เขาไม่ยอมแปลงให้
อาจเป็นเพราะมีรหัสแปลกปลอมในไฟล์
เลยเขียนสคริปต์ไว้ใช้แปลงเอง จะได้เผื่อสำหรับงานหน้าด้วย
ตั้งชื่อว่า d.tis2utf เอาไว้ใน /usr/local/bin

$ sudo touch /usr/local/bin/d.tis2utf
$ sudo chmod 755 /usr/local/bin/d.tis2utf
$ sudo vi /usr/local/bin/d.tis2utf

#!/usr/bin/env python
# CONVERT FILE CONTENT FROM tis620(cp874) TO utf8
import sys,os

# GLOBAL VARS
decodec="cp874"
encodec="utf8"
#
# VARIABLE decodec AND encodec CAN BE CHANGED.
# POSSIBLE STANDARD ENCODINGS VALUES ARE:
# ascii, big5, big5hkscs, cp037, cp424, cp437, cp500, cp737, cp775, cp850,
# cp852, cp855, cp856, cp857, cp860, cp861, cp862, cp863, cp864, cp865,
# cp866, cp869, cp874, cp875, cp932, cp949, cp950, cp1006, cp1026, cp1140,
# cp1250, cp1251, cp1252, cp1253, cp1254, cp1255, cp1256, cp1257, cp1258,
# euc_jp, euc_jis_2004, euc_jisx0213, euc_kr, gb2312, gbk, gb18030, hz,
# iso2022_jp, iso2022_jp_1, iso2022_jp_2, iso2022_jp_2004, iso2022_jp_3,
# iso2022_jp_ext, iso2022_kr, latin_1, iso8859_2, iso8859_3, iso8859_4,
# iso8859_5, iso8859_6, iso8859_7, iso8859_8, iso8859_9, iso8859_10,
# iso8859_13, iso8859_14, iso8859_15, johab, koi8_r, koi8_u, mac_cyrillic,
# mac_greek, mac_iceland, mac_latin2, mac_roman, mac_turkish, ptcp154,
# shift_jis, shift_jis_2004, shift_jisx0213, utf_16, utf_16_be, utf_16_le,
# utf_7, utf_8, utf_8_sig
#
# PLEASE SEE http://docs.python.org/lib/standard-encodings.html
# FOR MORE INFORMATION.


def usage(progname):
    print "Usage: %s FILE" % (progname)
    print "Convert FILE from %s to %s, save old file in FILE.bak" % (decodec,encodec)


def cannotopenfile(filename):
    print "Cannot open file %s" % (filename)


def genfilename(filename="",ext="new"):
    if filename=="":
        return ""
    #
    if ext.lower()=="new":
        ext="new"
    #
    if ext.lower()!="new" and ext.lower()!="bak":
        ext="bak"
    #
    if os.path.exists(filename+"."+ext):
        i=0
        while os.path.exists(filename+"."+ext+str(i)) and (i < 1000):
            i=i+1
        #
        if i>999:
            return ""
        #
        return filename+"."+ext+str(i)
    else:
        return filename+"."+ext
    #


def convertfile(fs_old, fs_new):
    for eachline in fs_old:
        try:
            newline=eachline.decode(decodec).encode(encodec)
        except:
            newline=eachline
        #
        fs_new.write(newline)
    #
    return True
   

if __name__=="__main__":
    progname=os.path.basename(sys.argv[0])
    try:
        oldfile=sys.argv[1]
    except:
        usage(progname)
        sys.exit(1)
    #
    try:
        fsold=open(oldfile)
    except:
        cannotopenfile(oldfile)
        sys.exit(1)
    #
    newfile=genfilename(oldfile,"new")
    if newfile=="":
        print "Cannot save backup file"
        sys.exit(1)
    #
    try:
        fsnew=open(newfile,"w")
    except:
        cannotopenfile(newfile)
        sys.exit(1)
    #
    if convertfile(fsold,fsnew)==False:
        fsold.close()
        fsnew.close()
        print "Convert file %s faild" % (oldfile)
        sys.exit(1)
    #
    fsold.close()
    fsnew.close()
    bakfile=genfilename(oldfile,"bak")
    if bakfile=="":
        print "Cannot create bakup file, so utf8-file is %s" % (newfile)
        sys.exit(1)
    #
    os.rename(oldfile,bakfile)
    os.rename(newfile,oldfile)
    print "Convert %s success, save backup file in %s" % (oldfile,bakfile)

วิธีใช้ก็สั่ง d.tis2utf FILENAME.TXT
จะได้ FILENAME.TXT เป็นรหัส utf8 และ FILENAME.TXT.bak เป็นไฟล์เก่า

(ใครเขียนไพธอนเก่ง ๆ ฝากแนะนำด้วยครับ อยากเขียนให้กระชับ และดูง่าย)