# -*- coding: utf-8 -*- r'''修复被 GBK 二次编码搞乱的提交信息。 成因: PowerShell 的 git commit -m $msg 把 UTF-8 的中文按 GBK 传给 git, git 又把那串字节当 UTF-8 存了 —— 等于"多错一层"。 结果:ykxmz 1.5.0锛氭墜琛ㄧ TLS ... 恢复: 当前字符串 -> encode('gbk') 拿回原始 UTF-8 字节 -> decode('utf-8') 这个脚本给 git filter-branch --msg-filter 用: 消息从 stdin 进来,改完写到 stdout。 ''' from __future__ import annotations import sys # 明显的乱码特征字(GBK 误读 UTF-8 会产生这些生僻字) MARKERS = "锛氬焷姘噰鏃粈缂撳啿鏈嬭繛璇佷功鍏煎寘涓嬭浇鍖哄尯鐗堟湰" def fix(text: str) -> str: """试着把乱码还原;还原不了就原样返回。""" if not any(ch in text for ch in MARKERS): return text try: recovered = text.encode("gbk").decode("utf-8") except (UnicodeEncodeError, UnicodeDecodeError): return text # 还原后如果还有一堆乱码特征,说明不是这个问题,别乱改 if any(ch in recovered for ch in MARKERS): return text return recovered def main() -> int: raw = sys.stdin.buffer.read() text = raw.decode("utf-8", "replace") sys.stdout.buffer.write(fix(text).encode("utf-8")) return 0 if __name__ == "__main__": sys.exit(main())