at_yasu's blog

ロード的なことを

ファイルの文字コード変更

ファイルに複数の文字コードが入り乱れている場合があります。何かのお蔭で。

例えば、先頭から30行目はShift_JISで、以降はUTF-8と云うファイルがあるとします。
これでは上手くファイルを表示/編集することができません。

下記のプログラムは、一行一行の文字コードを見て指定した文字コードに変換して出力します。

使用例

$ n2m_code.py gallery.xml > gallery.utf8.xml # デフォルトではutf8に変換します
$ n2m_code.py euc_jp gallery.xml             # gallery.xmlの内容をeuc-jpに統一して、出力させます。


以下、プログラム

#!/usr/bin/env python
#  -*- mode:python; coding:utf-8 -*-
# Program name : n2m_code.py
#
# written by a.yasui@gmail.com
#

# 
# name = get_jp_encoding_name(msg[,char_code])
# name is msg encoding type name.
# This only check the Japanese.
#

def get_jp_encoding_name (msg,char_code = 'iso-2022-jp'):
	import types
	
	enc_name = char_code or 'iso-2022-jp'
	check_type = ['utf_8',
				   enc_name,		'iso2022_jp_1', 'iso2022_jp_2',
				   'iso2022_jp_2004','iso2022_jp_3', 'iso2022_jp_ext',
				   'shift-jis',	  'cp932',		'shift_jis_2004',
				   'shift_jisx0213', 'euc_jp',	   'euc_jis_2004',
				   'euc_jisx0213']
	for enc in check_type:
		try:
			if isinstance(msg, types.StringType):
				s = msg.decode(enc)
			else:
				s = unicode(msg,enc)
		except :
			continue
		return enc
	return None


if __name__ == '__main__':
	import sys
	files	= []
	outcode = 'utf_8'
	if len(sys.argv)>2:
		outcode = sys.argv[1]
		files	= sys.argv[2:]
	else :
		files	= sys.argv[1:]
	print outcode
	
	for file in files:
		handle = open(file, "r")
		for line in handle.readlines():
			print line.decode(get_jp_encoding_name(line)).encode(outcode)
		handle.close()