在网上看了很多例子,也查了python API,发现都不完整,原因就在于都没考虑到有BOM和无BOM两种情况。也有说用codecs.EncodedFile(...)来做的,试了很多次,无论是有BOM还是无BOM,转成GBK都失败。

下面来看我的试验过程。

1.无BOM的UTF-8转GBK

首先用ultraedit新建一个文本文件,并存为UTF-8 无BOM格式,我的叫“u8.txt”,内容为“试 试 这 个”,带回车换行,并且字符间加了空格,以便定位;

其次,写代码测试:

importcodecs

f = open("u8.txt", "r");

data = f.read();

print repr(data)

print data.decode("utf-8").encode("gbk")

s = '/xe8/xbf/x99 /xe4/xb8/xaa';

print s.decode("utf-8").encode("gbk")

f.close();

运行查看结果:

根据输出可见,第一行是4个汉字字符的UTF-8编码,每个字符占3个字节,最后跟着一个换行符;第二行是编码为GBK后打印的结果,说明编码转换没有问题;注意字符串s的内容为我手工截取的最后两个字符的字节编码,即“这 个”,对s先解码再编码成GBK后,成功输出。

由此可知,无BOM的UTF-8转换成GBK是很容易的。

2.有BOM的UTF-8转GBK

首先,仍然用ultraedit新建一个文本文件,但是需要保存为UTF-8,这就是有BOM的格式,我的是“char.txt”,内容为“老 子 不 信 转 不 过 来”,也是带空格以便定位字符,仍然用上面的代码运行,结果为:

出现错误!提示说无法对0字节处采用GBK编码,再看显示出的编码序列,发现最开头那段6个字节连在一起,但是我们的字符串分明是按空格分开的!怎么回事?!通过查wikipedia发现:

原来最开始的“/xef/xbb/xbf”是UTF-8的BOM!那是不是因为这个BOM才造成编码转换失败的呢?可以复制BOM后面的内容作为字符串s的内容,写代码测试,代码如下:

s = '/xe8/x80/x81 /xe5/xad/x90 /xe4/xb8/x8d /xe4/xbf/xa1 /xe8/xbd/xac /xe4/xb8/x8d /xe8/xbf/x87 /xe6/x9d/xa5/n'

print s.decode("utf-8").encode("gbk")

运行后发现,转换成功进行,这就是说,只要能在转换前去掉BOM,那么就能转换成功。

根据上面的心得,我写了下面的代码测试:

代码说明:bom为读取文件前3个字节的内容,codecs.BOM_UTF8代表的就是utf8 BOM的字节编码,前面已经提到了。if语句判断是否为UTF8 BOM格式,如果是,我们就从文件的第3个字节开始读文件,以便避开BOM,然后就是转换,最后成功输出。

代码中“注意”那行打印出字节编码,可见,字符已被转换成2 Bytes per character的GBK编码格式。

结束语:这里只写了UTF8格式的,UTF16的道理也一样,只是UTF16的BOM只有两个字节,具体可见上面的BOM表示的图。总结起来说就是:UTF8转GBK本来是很容易的,因为字符都对应,只是因为有了BOM,使问题变得麻烦些,不过弄懂了原理也不复杂

java转文件编码bom_编码转换:UTF-8 BOM to GBK相关推荐

  1. 使用java进行文件编码转换

    在开发过程中,可能会遇到文件编码的转换,尽管说开发工具eclipse能够转换编码,可是有的情况却非常不方便.比方,原来文件本身的编码是GBK,如今要转换成UTF-8,假设直接在eclipse中把文件编 ...

  2. java文件全是数字编码_批量将Java源代码文件的编码从GBK转为UTF-8

    最近在做一个项目,需要从以前的另外一个项目迁移大量源代码过来,但是由于另一个项目采用GBK编码格式,而新项目采用的UTF-8编码格式,如果直接把Java源代码复制到Eclipse中所有的中文信息都出现 ...

  3. java获取文件编码

    目录 1. 概述 2. 编码基本知识 2.1. iso8859-1 2.2. GB2312/GBK 2.3. unicode 2.4. UTF 3.JAVA中移位运算>> , <&l ...

  4. java printable_java解析电话薄 VCF文件ENCODING=QUOTED-PRINTABLE编码

    posted on 2008-08-04 11:28 青菜猫(孙宇) 阅读(5587) 评论(6)  编辑  收藏 所属分类: java FeedBack: # re: java解析电话薄 VCF文件 ...

  5. java 项目 gbk 转utf-8_[idea]Java的GBK编码项目统一转换成utf-8格式

    Java的GBK编码项目统一转换成utf-8格式 0. 直接运行jar包 java -jar GBK2UTF8.jar 1. 构建 原理 使用common io批量将java编码从GBK转UTF-8 ...

  6. linux下使用iconv转换编码,linux iconv 转换文件编码

    查看文件编码 file -i filename 递归转换(包括子文件夹) find default -type d -exec mkdir -p utf/{} \; find default -typ ...

  7. linux检测文件名编码,Linux下查看文件编码,文件或文件名编码格式转换 | 缥缈的云...

    如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8.下面介绍一下,在Li ...

  8. 结合file和iconv命令转换文件的字符编码类型

    http://hi.baidu.com/netwrom/blog/item/8885f31ef0d09ae7e1fe0b1c.html 在很多类unix平台上都有一个iconv工具,可以用来转换字符编 ...

  9. Linux 命令之 iconv -- 转换文件的字符编码

    文章目录 一.命令介绍 二.命令语法 三.常用选项 四.命令示例 (一)对指定文件进行转码,且输出到指定的文件中 一.命令介绍 iconv 命令是 Linux 系统自带的用于转换文件编码的命令行工具, ...

最新文章

  1. 序列化和反序列化(转)
  2. 大盘点 | 2020年「13篇」人脸算法最佳综述
  3. this.Index = this._count - 1
  4. 数据库视频总结二(Transact-SQL语言)
  5. 关于使用两个GTP/GTX出现[DRC RTSTAT-1]error([route 35-54] critical warning)的问题详解
  6. vue之node.js的简单介绍
  7. Office2010翻译无处不在
  8. 尝试对知乎网验证码进行处理:
  9. 深度学习 + OpenCV,Python实现实时视频目标检测
  10. Tensflow的equal函数
  11. linux备份文件放在哪里,linux备份文件命令有哪些?
  12. 如何结束vbs的代码
  13. aria2 php,ac68u之aria2安装教程-新手摸索篇 - 52asus - 华硕网络设备技术交流平台
  14. 杂谈之什么是FullGC
  15. 【解决】Outlook无法正常显示邮件中的图片
  16. 1183: 【入门】判断能否构成三角形
  17. AndroidManifest.xml 最全详解(转载)
  18. php apache win7,win7配置Apache24和PHP7.2.4开发环境
  19. python药店销售数据分析_Python:某医院药品销售数据分析
  20. Angular2 网站 SEO 攻略

热门文章

  1. Redis性能指标监控
  2. RabbitMQ脑裂
  3. 【专题介绍】音视频+
  4. 音视频技术开发周刊 | 193
  5. 音视频技术开发周刊 | 168
  6. Linux系统——架构浅析
  7. 腾讯DCI网络SDN SR-TE方案详解
  8. ElasticSearch查询 第四篇:匹配查询(Match)
  9. DNS 与BIND(第五版)
  10. 自动驾驶多传感器融合