递归修改当前目录 .cpp、.h、.md 文件为 UTF8 或 UTF8-BOM 格式

2023-10-21 15:34:15 浏览数 (1)

有些代码目录下的文件格式不同,会导致一些编译错误或者中文出现错误等等问题,下面脚本就是解决这个问题而生的。使用 Autoit3 编译脚本后放到你要转换的目录中,运行脚本会转换所有 .cpp、.h、.md 文件为 UTF8 格式,如果你希望修改成 UTF8-BOM 格式,可以将 FO_UTF8_NOBOM 修改为 FO_UTF8

代码语言:javascript复制
#include <Array.au3> ; Only required to display the arrays
#include <File.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>

$aArray = _FileListToArrayRec(@ScriptDir, "*.cpp;*.h;*.md", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT)
_ArrayDisplay($aArray, "待转换列表.")

For $i = 0 To $aArray[0]
    _Convert2UTF8(@ScriptDir & '' & $aArray[$i])
Next

Func _Convert2UTF8($sFilePath)
    Local $hInputFile = FileOpen($sFilePath)
    Local $s_Txt = FileRead($hInputFile)
    FileClose($hInputFile)
    Local $hOutputFile = FileOpen($sFilePath, $FO_OVERWRITE   $FO_UTF8_NOBOM)
    FileWrite($hOutputFile, $s_Txt)
    FileClose($hOutputFile)
EndFunc

新增 Python3 版本的脚本,可以通过命令 pythonfile.py -e utf-8-sigpythonfile.py -e utf-8 对当前目录下文件进行转换。pythonfile.py 是你保存的文件名。执行前需要 pip install chardet 安装包。

代码语言:javascript复制
import argparse
import chardet
import codecs
import os

parser = argparse.ArgumentParser(description='convert encoding')
parser.add_argument('-e', '--encoding', dest='encoding', metavar=None, required=True, action='store', help='encoding')
args = parser.parse_args()

for root, dirs, files in os.walk(".", topdown=False):
    for name in files:
        if name.endswith(".cpp") or name.endswith(".h") or name.endswith(".md"):
            content = codecs.open(os.path.join(root, name), 'rb').read()
            encoding = chardet.detect(content)
            if encoding["encoding"] is None:
                continue
            if encoding["encoding"].upper() != args.encoding.upper():
                print(encoding["encoding"], "t", os.path.join(root, name))
                content = content.decode(encoding["encoding"], 'ignore')
                codecs.open(os.path.join(root, name), 'w', encoding=args.encoding).write(content)

0 人点赞