Skip to content

Python 实战:对文本文件字符编码进行转换

要求

使用 visual studio code 用 utf8 编码保存一段中文英文数字混合的文本到 source.txt 文件中,然后用gbk编码重新打开,会发现乱码了。重新改成用utf-8编码打开,发现恢复正常。

现需要:

  • 编写python程序,将上述utf-8编码的source.txt 文件转换成gbk编码写入到 target.txt 文件中。
  • 整理字符集、字符编码的概念,整理 utf-8、gbk 的编码方案。
  • 整理文本文件、二进制文件的概念与区别。

实现

文件名:encoding_converter.py ,内容:

python
def convert_encoding():  # 将UTF-8编码的source.txt文件转换为GBK编码的target.txt文件
    try:
        print("正在读取UTF-8编码的source.txt文件...")  # 读取UTF-8编码的源文件
        with open('source.txt', 'r', encoding='utf-8') as source_file:
            content = source_file.read()
            print("文件读取成功")
            print(f"文件内容:\n{content}")

        print("\n正在写入GBK编码的target.txt文件...")  # 写入GBK编码的目标文件
        with open('target.txt', 'w', encoding='gbk') as target_file:
            target_file.write(content)
            print("文件写入成功")

        print("\n验证转换结果...")  # 验证转换结果
        with open('target.txt', 'r', encoding='gbk') as verify_file:
            gbk_content = verify_file.read()
            print("GBK文件读取成功")
            print(f"GBK文件内容:\n{gbk_content}")

    except FileNotFoundError:  # 处理文件不存在的错误
        print("错误:找不到source.txt文件")
        print("请确保source.txt文件存在于当前目录")
    except UnicodeDecodeError:  # 处理编码识别错误
        print("错误:文件编码识别失败")
        print("请检查文件编码格式")
    except Exception as e:  # 处理其他所有可能的任务
        print(f"发生错误:{e}")


if __name__ == "__main__":  # 运行主函数
    convert_encoding()

同一目录下新建文件 source.txt ,内容是 你好世界 。执行上述代码,会得到文件 target.txt 。使用 utf-8 打开 target.txt ,会发现是乱码。

代码执行时在控制台/命令行的输出:

正在读取UTF-8编码的source.txt文件...
文件读取成功
文件内容:
你好世界

正在写入GBK编码的target.txt文件...
文件写入成功

验证转换结果...
GBK文件读取成功
GBK文件内容:
你好世界

字符集与字符编码

字符集是字符的集合,为每个字符分配唯一的编号(码点)。
常见字符集:

  • ASCII: 128个字符,包含英文字母、数字、标点符号
  • GB2312: 中国国家标准,包含6763个汉字
  • GBK: GB2312的扩展,包含21886个字符
  • Unicode: 国际标准,包含世界上所有文字的字符

字符编码是将字符集的码点转换为二进制数据的规则。

UTF-8编码方案

  • 0xxxxxxx 1字节
  • 110xxxxx 10xxxxxx 2字节
  • 1110xxxx 10xxxxxx 10xxxxxx 3字节
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4字节

GBK编码方案

  • 双字节编码
  • 第一个字节:0x81--0xFE
  • 第二个字节:0x40--0xFE
  • 包含所有GB2312字符和扩展字符

文本文件与二进制文件

(1) 文本文件

  • 以字符形式存储数据
  • 包含可读的文本内容
  • 使用特定编码(UTF-8、GBK等)
  • 可以用文本编辑器直接打开编辑
    如:.txt, .csv, .html, .py文件

(2) 二进制文件

  • 以字节形式存储数据
  • 包含机器可读的二进制数据
  • 不能用文本编辑器直接阅读
  • 需要特定程序解析
    如:.exe, .jpg, .mp3, .xlsx文件