• Python:将utf-8格式的文件转换成gbk格式的文件


    需求:将utf-8格式的文件转换成gbk格式的文件
    实现代码如下:
    def ReadFile(filePath,encoding="utf-8"):
        with codecs.open(filePath,"r",encoding) as f:
            return f.read()
     
    def WriteFile(filePath,u,encoding="gbk"):
        with codecs.open(filePath,"w",encoding) as f:
            f.write(u)
     
    def UTF8_2_GBK(src,dst):
        content = ReadFile(src,encoding="utf-8")
        WriteFile(dst,content,encoding="gbk")
    代码讲解:
    函数ReadFile的第二个参数指定以utf-8格式的编码方式读取文件,返回的结果content为Unicode
    然后,在将Unicode以gbk格式写入文件中。
    这样就能实现需求。
    但是,如果要转换格式的文件中包含有一些字符并不包含在gbk字符集中的话,就会报错,类似如下:
    UnicodeEncodeError: 'gbk' codec can't encode character u'xa0' in position 4813: illegal multibyte sequence
    以上的报错信息的意思是:在将Unicode编码成gbk的时候,不能将Unicode u'xa0'编码成gbk。
    这里,我们需要弄清楚gb2312、gbk和gb18030三者之间的关系
    GB2312:6763个汉字
    GBK:21003个汉字
    GB18030-2000:27533个汉字
    GB18030-2005:70244个汉字
    所以,GBK是GB2312的超集,GB18030是GBK的超集。
    理清了关系之后,我们进一步改进下代码:
    def UTF8_2_GBK(src,dst):
        content = ReadFile(src,encoding="utf-8")
        WriteFile(dst,content,encoding="gb18030")

    运行后,发现没有报错,可以正常运行。

    因为,在GB18030字符集中,可以找到u'xa0'对应的字符。
     此外,还有另外一种实现方案:
    需要修改下WriteFile方法
    def WriteFile(filePath,u,encoding="gbk"):
        with codecs.open(filePath,"w") as f:
            f.write(u.encode(encoding,errors="ignore"))

    这里,我们将Unicode编码(encode)成gbk格式,但是注意encode函数的第二个参数,我们赋值"ignore",表示在编码的时候,忽略掉那些无法编码的字符,

    解码同理。
    但是,当我们执行后,发现可以成功的将utf-8格式的文件修改成了ansi格式。但,另外发现生成的文件中,每个一行都有一行空行。
    这里,可以指定以二进制流的形式写文件,修改后的代码如下:
    def WriteFile(filePath,u,encoding="gbk"):
        with codecs.open(filePath,"wb") as f:
            f.write(u.encode(encoding,errors="ignore"))
    相关文章:
  • 相关阅读:
    Working with WordprocessingML documents (Open XML SDK)
    How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC
    Azure:Manage anonymous read access to containers and blobs
    Convert HTML to PDF with New Plugin
    location.replace() keeps the history under control
    On the nightmare that is JSON Dates. Plus, JSON.NET and ASP.NET Web API
    HTTP Modules versus ASP.NET MVC Action Filters
    解读ASP.NET 5 & MVC6系列(6):Middleware详解
    Content Negotiation in ASP.NET Web API
    Action Results in Web API 2
  • 原文地址:https://www.cnblogs.com/hongfei/p/4240112.html
Copyright © 2020-2023  润新知