Help us understand the problem. What is going on with this article?

ソースコードの文字コードチェックスクリプト

More than 5 years have passed since last update.

はじめに

昔、ソースコードの文字コードチェックの必要が出てきたので、pythonで作りJenkisで定期的にチェックを走らせるようにしたのでそのメモ

なぜソースコードの文字コードチェックが必要?

  • ゲームを開発してると、海外対応とか出てきて、s-Jisのソースに日本語が書かれてたりするとなにか問題になりがち。

  • ソースコードをウェブで見るとコメントが化ける!(出先でコード確認し辛い)

  • せっかくDoxygen形式でコメントをかいたのに全部化ける。

  • 意味不明なコンパイルエラーとか起こったり起こらなかったり。

実装

mojicodecheck.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
    @brief  文字コードチェック
    @author DM
    @date   2012/10/13
"""

import os, os.path, sys, re, time
import glob
import codecs
import chardet

# 無視するフォルダ
ignorelist  = ["tgs","tools_src","shader","ext"]

# チェックするファイルの拡張子
extention  = [".c",".cpp",".h",".inc",".inl",".hpp"]

#   main
def main():
    sys.stdout = codecs.getwriter("shift_jis")(sys.stdout) # 出力
    sys.stdin = codecs.getreader("shift_jis")(sys.stdin) # 入力

    # 使い方表示
    if len(sys.argv) < 2 or len(sys.argv) > 4:
        __usage()
        sys.exit(0)

    start_time = time.clock()

    # プロジェクトのディレクトリ
    path = os.path.normpath(sys.argv[1])    # モジュールファイルのパス取得
    print(path)


    ret = True


    for (root, dirs, files) in os.walk(path):
        for file in files:
            file_path = os.path.join(root, file)

            base, ext = os.path.splitext(file_path)

            ignore = False
            for d in ignorelist:
                if file_path.find(d) > 0:
                    ignore = True
                    break;

            if ignore == True:
                continue

            if ext in extention:
                try:
                    f = open(file_path, 'r')
                    data = f.read()
                    p = chardet.detect(data)
                    if p['encoding'] == 'SHIFT_JIS':
                        print('error',p['encoding'],file_path)
                        ret = False
                except IOError:
                    print(file_path, 'cannot be opened.')
                finally:
                    f.close()

    end_time = time.clock()
    print("complete![time: ",(end_time - start_time),"sec]")

    if ret == False:
        CODE='S001'
        MESSAGE='shift-jis still exists!!'
        EXPECTED='S999-error'
        ACTUAL='sample ' + CODE +' '+ MESSAGE
        sys.exit(EXPECTED+' '+ACTUAL)

# __main__
if __name__ == '__main__':
    #psyco.full()
    main()

  • あとはJenkinsで定期的に
python mojicodecheck.py ${BUILD_DIR}

を実行すれば、

[MojiCodeCheck] $ /bin/sh -xe /tmp/hudson2121374754708119058.sh
+ python /var/lib/jenkins/workspace/soilproject/common/tools/mojicodecheck.py /var/lib/jenkins/workspace/soilproject
/var/lib/jenkins/workspace/soilproject
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/TGLSystemTypes.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/TGLEffectEmit.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/Program/EPrgZanplu.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/Program/EPrgSpiral.cpp')
('complete![time: ', 15.200000000000001, 'sec]')
S999-error sample S001 shift-jis still exists!!
Build step 'Execute shell' marked build as failure
Notifying upstream projects of job completion
Finished: FAILURE

こんな感じでs-Jisなソースがログに出力されます。
※現在アスタブリードでは、 s-Jisなファイルが78ファイル存在します。 言語対応に関係ないソースばっかなので放置してます( ´∀`)

おしまい。

DandyMania
ただのしがないゲームプログラマです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした