当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:

原有编码 -> 内部编码(UNICODE) -> 目的编码

\xa0 是不间断空白符 

我们通常所用的空格是 \x20 ,是在标准ASCII可见字符 0x20~0x7e 范围内。
\xa0 属于 latin1 (ISO/IEC_8859-1)中的扩展字符集字符,代表空白符nbsp(non-breaking space)。
latin1 字符集向下兼容 ASCII ( 0x20~0x7e )。通常我们见到的字符多数是 latin1 的,比如在 MySQL 数据库中。

这里也有一张简陋的Latin1字符集对照表。

\u3000 是全角的空白符

根据Unicode编码标准及其基本多语言面的定义, \u3000 属于CJK字符的CJK标点符号区块内,是空白字符之一。它的名字是 Ideographic Space ,有人译作表意字空格、象形字空格等。顾名思义,就是全角的 CJK 空格。它跟 nbsp 不一样,是可以被换行间断的。常用于制造缩进, wiki 还说用于抬头,但没见过。

这里还有一个 Unicode.org 上关于 CJK 标点符号块的字符代码表。

在读取文件的时候,可以让codecs来代劳。

codecs读文件

results.txt

两部委:到2020年底重点城市生活垃圾得到有效分类(图)
英雄惜英雄! 传奇为格策叫冤:已尽力不应被批
中华关爱失能老兵和老人公益行活动启动仪式在京举行(组图)
国安酷暑作战满意拿分 谢峰:上半场少补一次水
国内首家省级民营投资平台在无锡揭牌成立
5月外汇供求进一步趋向平衡 跨境资金流出压力缓解
#-*- coding: UTF-8 -*-import codecs# 第三个参数可以为r只读 w只写 a附加 r+读写
cf = codecs.open("results.txt", "r", "UTF-8")
s = cf.read()
print s.encode("GBK", 'ignore')
cf.close()

如果报以下错误:

UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position 659: illegal multibyte sequence

是因为Windows cmd默认是GBK(CP936)编码,有部分Unicde的字符无法编码为GBK,所以可以把这些字符替换为空格,或者忽略掉。

string.replace(u'\xa0', u' ')

print "非法字符\xa0".encode("GBK", 'ignore');

codecs从UTF-8转换为GBK格式

#-*- coding: UTF-8 -*-import sys
reload(sys)
# 设置系统默认编码
sys.setdefaultencoding("gbk")
import codecscrf = codecs.open("results.txt", "r", "UTF-8")
s = crf.read()
crf.close()cwf = codecs.open("out.txt", "w", "gbk")
print type(s)
# 把UTF-8编码的字符串转换为GBK编码,并忽略掉无法编码的字符。
cwf.write(s.encode("gbk", 'ignore'))
cwf.flush()
cwf.close()

如果不加sys.setdefaultencoding("gbk")报错:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 2: invalid c
ontinuation byte

sys.setdefaultencoding("gbk") 是把系统默认编码方式设置为GBK。

使用编码器

#-*- coding: UTF-8 -*-import codecs# 创建gb2312编码器
cgb   =  codecs.lookup("gb2312")# 创建utf-8编码器
# lookup函数返回一个包含四个元素的TUPLE
cutf8  =  codecs.lookup("utf-8")print cutf8[0]
# <built-in function utf_8_encode>
# 同 codecs.getencoder("utf-8")print cutf8[1]
# <function decode at 0x0000000002A20978>
# 同 codecs.getdecoder("utf-8")print cutf8[2]
# encodings.utf_8.StreamReader
# 同 codecs.getreader("utf-8")print cutf8[3]
# encodings.utf_8.StreamWriter
# 同 codecs.getwriter("utf-8")stest = "我爱北京天安门"print len(stest), stest, type(stest)
# 21 鎴戠埍鍖椾含澶╁畨闂?<type 'str'># 从单字节到多字节叫做decoding
utest = cutf8.decode(stest)
# (u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8', 21)print utest[0], type(utest[0])
# 我爱北京天安门 <type 'unicode'># 从多字节到单字节叫做encoding
gtest = cgb.encode(utest[0])
# ('\xce\xd2\xb0\xae\xb1\xb1\xbe\xa9\xcc\xec\xb0\xb2\xc3\xc5', 7)print gtest[0], type(gtest[0])
# 我爱北京天安门 <type 'str'>

从单字节到多字节叫做decoding,从多字节到单字节叫做 encoding。

为什么从 unicode 转 str 是 encode,而反过来叫 decode?

因为 Python 认为 16 位的 unicode 才是字符的唯一内码,而大家常用的字符集如 gb2312,gb18030/gbk,utf-8,以及 ascii 都是字符的二进制(字节)编码形式。把字符从 unicode 转换成二进制编码,当然是要 encode。

反过来,在 Python 中出现的 str 都是用字符集编码的 ansi 字符串。Python 本身并不知道 str 的编码,需要由开发者指定正确的字符集 decode。

参考

  • http://blog.csdn.net/gooooa/article/details/72731429
  • https://www.crifan.com/tutorial_python_codecs_process_file_char_encoding/
  • http://blog.csdn.net/suofiya2008/article/details/5579413
  • http://in355hz.iteye.com/blog/1860787

解决\xa0 、 \u3000导致的编码问题相关推荐

  1. 【爬虫笔记】关于 \u200b \xa0 \u3000等特殊字符

    在进行网页爬虫分析时,遇到了一些特殊字符,通过网络搜索找到了解决方法,所以利用这篇博文将遇到的问题以及解决方法记录下来,方便回顾,也希望这篇博文能够帮助到大家. \u200b \xa0 \u3000等 ...

  2. 解决python2.x文件读写编码问题

    解决python2.x文件读写编码问题 参考文章: (1)解决python2.x文件读写编码问题 (2)https://www.cnblogs.com/nyist-xsk/p/9681064.html ...

  3. html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题

    html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题 参考文章: (1)html5新特性:利用history的pushState等方法来解决使用aj ...

  4. 解决mybatis中#{}导致的The error may involve defaultParameterMap的问题

    解决mybatis中#{}导致的The error may involve defaultParameterMap的问题 参考文章: (1)解决mybatis中#{}导致的The error may ...

  5. 如何解决http封包中gzip编码的html

    1.什么是gzip gzip编码,最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩.我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的. ...

  6. python读取中文txt文本-Python3 解决读取中文文件txt编码的问题

    问题描述 尝试用Python写一个Wordcloud的时候,出现了编码问题. 照着网上某些博客的说法添添改改后,结果是变成了"UnicodeDecodeError: "utf-8' ...

  7. python读取中文文件报错-Python3 解决读取中文文件txt编码的问题

    问题描述 尝试用Python写一个Wordcloud的时候,出现了编码问题. 照着网上某些博客的说法添添改改后,结果是变成了"UnicodeDecodeError: "utf-8' ...

  8. Ubuntu 16.04配置CUDA 9.0+cudnn 7.0以及解决Nvidia显卡导致黑屏问题

    Ubuntu 16.04配置CUDA 9.0+cudnn 7.0以及解决Nvidia显卡导致黑屏问题 参考文章: (1)Ubuntu 16.04配置CUDA 9.0+cudnn 7.0以及解决Nvid ...

  9. 解决java中对URL编码的问题

    解决java中对URL编码的问题 参考文章: (1)解决java中对URL编码的问题 (2)https://www.cnblogs.com/a198720/p/4210763.html 备忘一下.

最新文章

  1. invalid project description._[Project教程] 在Project软件中如何处理加班工时
  2. 业界 | 微软亚洲研究院携手培生,以人工智能技术赋能个性化学习
  3. NYOJ 45 棋盘覆盖
  4. CLR Via CSharp读书笔记(26) - 计算限制的异步操作
  5. java base64 编码 类_java base64编码和解码的三种方式 | 学步园
  6. Unity3D的一些坑
  7. wxWidgets:wxWindowUpdateLocker类用法
  8. 1900页Python系列PPT分享四:字符串与正则表达式(109页)
  9. linux 下测速时间分析
  10. 阿里巴巴YunOS加入物联网标准组织ZigBee联盟
  11. 六个好用的程序员开发在线工具
  12. JS 验证身份证及获取地区
  13. Revit SDK 介绍:CompoundStructure 复合结构
  14. EDK2编译环境搭建、编译、在模拟器运行、在笔记本运行(带目录版本)
  15. lpk劫持方式粘滞键后门后门T00ls Lpk Sethc v3.0 正式版下载
  16. 7、Java基础——从控制台输入:Scanner类的的用法、数据类型转换、字符型的运算、print与println的区别、Java中的转义字符
  17. Word 2016怎么安装公式编辑器
  18. 报错Content type ‘multipart/form-data;boundary=----WebKitFormBoundaryTz0sivpVO7U0H70m;charset=UTF-8‘ n
  19. jnz和djnz_单片机里的cjne  djnz分别是什么意思?
  20. 远程视频监控:MJPG-Streamer

热门文章

  1. 汽车振动实模态分析-模态分析法(附程序)
  2. 免费的采样器和音源拓展下载-Zampler + Libraries WiN-MAC
  3. 运动控制:感觉反馈可以引起神经旋转
  4. php微信接口怎么开发,php微信公众平台配置接口开发程序的方法实例详解
  5. 全球与中国PMP微波回传系统市场深度研究分析报告
  6. 第12节:RNN原理及numpy实现
  7. 和ha水解的不同_水解蛋白奶粉有哪些,让超启能恩缓解宝宝的“小敏感”
  8. WebLogic 12c 配置 https
  9. 如何在Mac OS X上重置丢失的管理员密码
  10. Flutter TextStyle超级方便的统一管理器