精华内容
下载资源
问答
  • nlp:中文编码类型

    2018-10-16 21:43:00
    GB2312:简体中文编码方式,一个汉字占用两个字节,在大陆是主要编码方式。 BIG5:繁体中文编码方式,主要在台湾地区使用 GBK:支持简体和繁体中文,不支持某些非拉丁字母 UTF-8:兼容ASCII,兼容万国语言 ...

    GB2312:简体中文编码方式,一个汉字占用两个字节,在大陆是主要编码方式。


    BIG5:繁体中文编码方式,主要在台湾地区使用


    GBK:支持简体和繁体中文,不支持某些非拉丁字母


    UTF-8:兼容ASCII,兼容万国语言

    展开全文
  • 这篇文章介绍的内容是关于Python中的中文编码问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下1.python中的中文编码问题1.1 .py文件中的编码Python 默认脚本文件都是 ANSCII 编码的,当文件 中...

    这篇文章介绍的内容是关于Python中的中文编码问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    1.python中的中文编码问题

    1.1 .py文件中的编码

    Python 默认脚本文件都是 ANSCII 编码的,当文件 中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正。 一个module的定义中,如果.py文件中包含中文字符(严格的说是含有非anscii字符),则需要在第一行或第二行指定编码声明:

    # -*- coding=utf-8 -*-或者 #coding=utf-8 其他的编码如:gbk、gb2312也可以; 否则会出现类似:SyntaxError: Non-ASCII character '/xe4' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho for details这样的异常信息;n.org/peps/pep-0263.html

    1.2 python中的编码与解码

    先说一下python中的字符串类型,在python中有两种字符串类型,分别是str和unicode,他们都是basestring的派生类;str类型是一个包含Characters represent (at least) 8-bit bytes的序列;unicode的每个unit是一个unicode obj;所以:

    len(u'中国')的值是2;len('ab')的值也是2;

    在str的文档中有这样的一句话:The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file. 也就是说在读取一个文件的内容,或者从网络上读取到内容时,保持的对象为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等;

    python中提供的转换函数:

    unicode转为 gb2312,utf-8等# -*- coding=UTF-8 -*-

    if __name__ == '__main__':

    s = u'中国'

    s_gb = s.encode('gb2312')

    utf-8,GBK转换为unicode 使用函数unicode(s,encoding) 或者s.decode(encoding)# -*- coding=UTF-8 -*-

    if __name__ == '__main__': s = u'中国'

    #s为unicode先转为utf-8

    s_utf8 = s.encode('UTF-8')

    assert(s_utf8.decode('utf-8') == s)

    普通的str转为unicode# -*- coding=UTF-8 -*-

    if __name__ == '__main__': s = '中国'

    su = u'中国''

    #s为unicode先转为utf-8

    #因为s为所在的.py(# -*- coding=UTF-8 -*-)编码为utf-8

    s_unicode = s.decode('UTF-8')

    assert(s_unicode == su)

    #s转为gb2312,先转为unicode再转为gb2312

    s.decode('utf-8').encode('gb2312')

    #如果直接执行s.encode('gb2312')会发生什么?

    s.encode('gb2312')

    # -*- coding=UTF-8 -*-

    if __name__ == '__main__': s = '中国'

    #如果直接执行s.encode('gb2312')会发生什么?

    s.encode('gb2312')

    这里会发生一个异常:

    Python 会自动的先将 s 解码为 unicode ,然后再编码成 gb2312。因为解码是python自动进行的,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是 ANSCII,如果 s 不是这个类型就会出错。

    拿上面的情况来说,我的 sys.defaultencoding 是 anscii,而 s 的编码方式和文件的编码方式一致,是 utf8 的,所以出错了: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

    对于这种情况,我们有两种方法来改正错误:

    一是明确的指示出 s 的编码方式#! /usr/bin/env python

    # -*- coding: utf-8 -*-

    s = '中文'

    s.decode('utf-8').encode('gb2312')

    二是更改 sys.defaultencoding 为文件的编码方式#! /usr/bin/env python

    # -*- coding: utf-8 -*-

    import sys

    reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入

    sys.setdefaultencoding('utf-8')

    str = '中文'

    str.encode('gb2312')

    文件编码与print函数

    建立一个文件test.txt,文件格式用ANSI,内容为:

    abc中文

    用python来读取

    # coding=gbk

    print open("Test.txt").read()

    结果:abc中文

    把文件格式改成UTF-8:

    结果:abc涓枃

    显然,这里需要解码:# coding=gbk

    import codecs

    print open("Test.txt").read().decode("utf-8")

    结果:abc中文

    上面的test.txt我是用Editplus来编辑的,但当我用Windows自带的记事本编辑并存成UTF-8格式时,

    运行时报错:Traceback (most recent call last):

    File "ChineseTest.py", line 3, in

    print open("Test.txt").read().decode("utf-8")

    UnicodeEncodeError: 'gbk' codec can't encode character u'/ufeff' in position 0: illegal multibyte sequence

    原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。

    因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:# coding=gbk

    import codecs

    data = open("Test.txt").read()

    if data[:3] == codecs.BOM_UTF8:

    data = data[3:]

    print data.decode("utf-8")

    结果:abc中文

    (四)一点遗留问题

    在第二部分中,我们用unicode函数和decode方法把str转换成unicode。为什么这两个函数的参数用"gbk"呢?

    第一反应是我们的编码声明里用了gbk(# coding=gbk),但真是这样?

    修改一下源文件:# coding=utf-8

    s = "中文"

    print unicode(s, "utf-8")

    运行,报错:Traceback (most recent call last):

    File "ChineseTest.py", line 3, in

    s = unicode(s, "utf-8")

    UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data

    显然,如果前面正常是因为两边都使用了gbk,那么这里我保持了两边utf-8一致,也应该正常,不至于报错。

    更进一步的例子,如果我们这里转换仍然用gbk:# coding=utf-8

    s = "中文"

    print unicode(s, "gbk")

    结果:中文

    python中的print原理:

    When Python executes a print statement, it simply passes the output to the operating system (using fwrite() or something like it), and some other program is responsible for actually displaying that output on the screen. For example, on Windows, it might be the Windows console subsystem that displays the result. Or if you're using Windows and running Python on a Unix box somewhere else, your Windows SSH client is actually responsible for displaying the data. If you are running Python in an xterm on Unix, then xterm and your X server handle the display.

    To print data reliably, you must know the encoding that this display program expects.

    简单地说,python中的print直接把字符串传递给操作系统,所以你需要把str解码成与操作系统一致的格式。Windows使用CP936(几乎与gbk相同),所以这里可以使用gbk。

    最后测试:# coding=utf-8

    s = "中文"

    rint unicode(s, "cp936")

    # 结果:中文

    这也可以解释为何如下输出不一致:>>> s="哈哈"

    >>> s'

    \xe5\x93\x88\xe5\x93\x88'

    >>> print s #这里为啥就可以呢? 见上文对print的解释

    哈哈>>> import sys

    >>> sys.getdefaultencoding() '

    ascii'

    >>> print s.encode('utf8') # s在encode之前系统默认按ascii模式把s解码为unicode,然后再encode为utf8

    Traceback (most recent call last):

    File "", line 1, in ?

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

    >>> print s.decode('utf-8').encode('utf8')

    哈哈

    >>>

    编码问题测试

    使用 chardet 可以很方便的实现字符串/文件的编码检测

    例子如下:>>>

    import

    urllib>>>

    rawdata = urllib.urlopen('http://www.google.cn/').read()>>>

    import

    chardet

    >>>

    chardet.detect(rawdata){'confidence': 0.98999999999999999, 'encoding': 'GB2312'}>>>

    chardet 下载地址 http://chardet.feedparser.org/

    特别提示:

    在工作中,经常遇到,读取一个文件,或者是从网页获取一个问题,明明看着是gb2312的编码,可是当使用decode转时,总是出错,这个时候,可以使用decode('gb18030')这个字符集来解决,如果还是有问题,这个时候,一定要注意,decode还有一个参数,比如,若要将某个String对象s从gbk内码转换为UTF-8,可以如下操作

    s.decode('gbk').encode('utf-8′)

    可是,在实际开发中,我发现,这种办法经常会出现异常:

    UnicodeDecodeError: ‘gbk' codec can't decode bytes in position 30664-30665: illegal multibyte sequence

    这 是因为遇到了非法字符——尤其是在某些用C/C++编写的程序中,全角空格往往有多种不同的实现方式,比如/xa3/xa0,或者/xa4/x57,这些 字符,看起来都是全角空格,但它们并不是“合法”的全角空格(真正的全角空格是/xa1/xa1),因此在转码的过程中出现了异常。

    这样的问题很让人头疼,因为只要字符串中出现了一个非法字符,整个字符串——有时候,就是整篇文章——就都无法转码。

    解决办法:s.decode('gbk', ‘ignore').encode('utf-8′)

    因为decode的函数原型是decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略,默认的参数就是strict,代表遇到非法字符时抛出异常;

    如果设置为ignore,则会忽略非法字符;

    如果设置为replace,则会用?取代非法字符;

    如果设置为xmlcharrefreplace,则使用XML的字符引用。

    python文档

    decode( [encoding[, errors]])

    Decodes the string using the codec registered for encoding. encoding defaults to the default string encoding. errors may be given to set a different error handling scheme. The default is 'strict', meaning that encoding errors raise UnicodeError. Other possible values are 'ignore', 'replace' and any other name registered via codecs.register_error, see section 4.8.1.

    详细出处参考:http://www.gxlcms.com/article/16104.htm

    参考文献

    【1】Python编码转换

    【2】全角半角转换的Python实现

    【3】Python编码实现

    展开全文
  • 在输入或者声明字符串的时候,尽早地使用decode方法将字符串转化成unicode编码格式;2.然后在程序内使用字符串的时候统一使用unicode格式进行处理,比如字符串拼接、字符串替换、获取字符串的长度等操作;3.最后,在...

    decode early, unicode everywhere, encode late

    1.在输入或者声明字符串的时候,尽早地使用decode方法将字符串转化成unicode编码格式;

    2.然后在程序内使用字符串的时候统一使用unicode格式进行处理,比如字符串拼接、字符串替换、获取字符串的长度等操作;

    3.最后,在输出字符串的时候(控制台/网页/文件),通过encode方法将字符串转化为你所想要的编码格式,比如utf-8等。

    输入(str,utf-8)--decode-->  操作unicode  --encode-->  输出(str, utf-8)

    #-*-coding:gb2312#-*-

    __author__='Administrator'

    importchardet

    #变量若声明前面不加u则在python2.x中采用ascii字符集,类型为str

    ss1="我是中文"

    printtype(ss1)#

    printchardet.detect(ss1)#{'confidence':0.99,'encoding':'GB2312'}

    #前面加u,采用Unicode字符集,类型为Unicode

    ss2=u'中文'

    printtype(ss2)#

    #调用decode函数,将str转换成unicode

    ss3=ss1.decode('gb2312')

    printtype(ss3)#

    #调用encode,将unicode转换成str

    ss4=ss3.encode('utf8')

    printtype(ss4)#

    printchardet.detect(ss4)#{'confidence':0.938125,'encoding':'utf-8'}

    展开全文
  • 1. 常用的编码ASCII:只能表示一些字母,数字和特殊的字符,占一个字节GBK:国家简体中文字符集和繁体字符集,兼容ASCII,占两个字节Unicode:能够表示全世界上所有的字符,Unicode有人说占4个字节也有人说占2个字节...

    1. 常用的编码

    ASCII:只能表示一些字母,数字和特殊的字符,占一个字节

    GBK:国家简体中文字符集和繁体字符集,兼容ASCII,占两个字节

    Unicode:能够表示全世界上所有的字符,Unicode有人说占4个字节也有人说占2个字节,但中文占2个字节

    UTF-8:Unicode的压缩版,占1~3个字节,其中中文占三个字节

    2.补充:计算机表示的单位:

    bit: 位,计算机最小的表示单位

    bytes:字节,最小的存储单位,1bytes=8bit,1bytes简写成1B

    1KB = 1024B

    1MB = 1024KB

    1GB = 1024MB

    1TB = 1024GB

    ......

    3.ASCII编码

    ASCII编码是基于拉丁字母一套编码,主要是显示现代英语和其西欧语言,是最早通用的单字节编码系统,具体ASCII对照表如下:

    在对照表中需要记住的是大写字母A的编码是65,小写字母a的编码的97即可。

    在python中可以使用chr和ord方法进行转换:

    # 将数字类型转换成ASCII对应的字符

    print(chr(97)) # a

    # 将数字转换成对应的数据

    print(ord("A")) # 65

    # 或者使用

    但随着事件的发展,ASCII编码扩展到了256个字符,编码 对照表如下:

    其中后128个字符称为扩展ASCII码

    2.GBK和GB2312编码

    由于ASCII编码只能由256个字符组成,然只能由1个字节来表示中文是不可能的,因此制定了GB2312编码,用来表示中文的对照表

    4.Unicode

    为了解决各个国家编码冲突的问题,Unicode编码就因此而生,Unicode把所有语言都统一到一套编码里面,就会避免冲突,产生乱码。

    Unicodeb标准在不断发展,最常用的是用两个字节表示一个字符,也有的字符是4个字节,但是中文是占两个字节。如果统一成Unicode编码,在存储和传输上就不划算

    5.UTF-8编码

    为了解决Unicode编码存储过大的问题,就推出了可变长编码UTF-8,UTF-8编码把一个Unicode字符依据不同的数据大小编程1~6个字节,其中中文就占3个字节

    6.编码和解码

    1.编码操作

    可以通过encode进行编码,其中语法如下:

    对字符串进行ASCII编码(只能转换数字,英文字母和一些符号)

    # 方式1: 通过bytes方法

    bytes('a', 'ASCII')

    # 方式2: 通过encode方法进行

    'a'.encode('ASCII')

    将字符串转换成gbk编码格式

    # 方式1: 通过encode方法进行

    print('你好'.encode('GBK')) # 编码之后的结果为:b'\xc4\xe3\xba\xc3'

    # 方式2: 通过bytes类型

    print(bytes('我爱你', 'GBK')) # 编码之后的结果为:b'\xce\xd2\xb0\xae\xc4\xe3'

    将字符串转换成Unicode编码格式

    # 方式1: 通过encode方法进行

    print('你好'.encode('unicode_escape')) # 编码之后的结果为:b'\\u4f60\\u597d'

    # 方式2: 通过bytes类型

    print(bytes('我爱你', 'unicode_escape')) # 编码之后的结果为:b'\\u6211\\u7231\\u4f60'

    将字符串转换成UTF-8编码格式

    # 方式1: 通过encode方法进行

    print('你好'.encode('utf-8')) # 编码之后的结果为:b'\xe4\xbd\xa0\xe5\xa5\xbd'

    # 方式2: 通过bytes类型

    print(bytes('我爱你', 'utf-8')) # 编码之后的结果为:b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'

    2.解码操作

    将GBK编码格式转换成字符串

    # 通过decode方法解码

    print(b'\xc4\xe3\xba\xc3\xce\xd2\xb0\xae\xc4\xe3'.decode('GBK')) # 解码之后结果为:你好我爱你

    将UTF-8编码格式转换成字符串

    # 通过decode方法解码

    print(b'\xe4\xbd\xa0\xe5\xa5\xbd\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'.decode('utf-8')) # 解码之后结果为:你好我爱你

    将Uniconde编码格式转换成字符串

    # 通过decode方法解码

    print(b'\\u4f60\\u597d\\u6211\\u7231\\u4f60'.decode('GBK')) # 解码之后结果为:你好我爱你

    到此这篇关于python中字符串的编码与解码的文章就介绍到这了,更多相关python字符串的编码与解码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

    本文标题: python中字符串的编码与解码详析

    本文地址: http://www.cppcns.com/jiaoben/python/367756.html

    展开全文
  • http://blog.csdn.net/zhoubl668/article/details/6914018ASCIIASCII码是7位编码编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。...HZ字符编码就是早期为了在只支持7位ASCII系统...
  • 最近编写资料用到这部分知识,便通过自己的分析和参考资料做了简单运用,下面我们一起分析常用的编码集与中文编码! 章节预览: 1.字符数组存储GB2312中文编码 2.GB2312标准 3.输出乱码原理 4.整数存储GB2312中文...
  • 判断中文文本是否为utf8编码类型的JavaScript实现原理参考资料Github 原理 常用汉字的unicode编码范围为4E00-9FA5,此范围被包含于UTF-8 3字节编码范围内。 故若文本由UTF-8编码时,一个汉字将由三个字节组成。 而这...
  • java 编码类型

    2016-05-28 23:16:14
    编码类型 ASCII:美国标准信息交换码。  用一个字节的7位可以表示。 ISO8859-1:拉丁码表。欧洲码表。  用一个字节的8为表示。 GB2312:中国的中文编码表。  用俩个字节表示一个汉字。 GBK:扩容后的中国中文编码...
  • 最近在做性能测试时,遇到URL中文转码的问题,如下: 如何才能将中文“血糖”转换为“%E8%A1%80%E7%B3%96”呢?自己也查了一些资料,现将解决方法给出,希望能帮助遇到相同问题的各位。其实解决该问题也比较简单...
  • python中文编码

    2018-09-15 14:47:09
    源代码文件默认是asci,但asci不存在中文编码,解决:# -*- coding: utf-8 -*- 中文编码有:gbk,gb2312,gb18030,utf-8 unicode类和str类型字符串(gbk,gb2312,utf-8)的编码:unicode由encode方法编码为字符串,...
  • 在编程领域中,中文编码问题一向是个很头疼的问题,今天写点总结一下解决的方法unicode与utf-8和gbk之间的转换,涉及到的函数有decode与encode首先明确一下,python中的字符串都是以某种编码来存储的,就中文来说,...
  • java中文乱码问题----常见编码类型

    千次阅读 2016-05-23 20:25:54
    在java里面的编码问题是一个非常常见的问题,最近在玩网络爬虫,在我写的一个最简单的...这让我想起来总结一下java中编码 中文乱码的问题,不能每次出错了就百度,要搞清楚其中的原理,顺便做个总结。 1. 问题的起源
  • 中文编码问题

    2018-03-24 11:51:00
    Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,  采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节;  采用GB2312或GBK编码方式时,一个中文字符占2个字节;  采用...
  • Python 中文编码

    2019-09-28 22:19:14
    # -*- coding:utf-8 -*- # ASCII 是一种单字节的编码...# 中文 在 python3 中默认用 unicode编码 lst = ['你', # str类型,unicode编码 str('你'), # 同上 u'你', # 同上 '你'.encode('utf-8').decode('utf-8'), ...
  • ** 总结1:只有字符类型即...总结3:加'u'表示Unicode编码,Unicode编码既包括utf-8,也包括ascii,未加u默认中文编码为'utf-8',加了u之后变成英文编码 总结4:对于中文字符的处理——将字符转换成str,再判断str是...
  • 前言继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型编码导致数据中文出现乱码...
  • 编码的本质 用于描述文字与二进制的对应关系 非Unicode的编码直接不能互相识别 编码的发展 ASCII 最早的编码 一个字节表示字母☛数字☛字符 ...每个国家都有自己的编码 ...除去 bytes 类型 计算机内存采用Unico
  • pymssql 中文编码错误

    2020-06-13 09:43:43
    ACode BCode为A库和B库的编码格式,处理思路是读完数据,bytes(content, encoding=BCode)乱码的内容,然后插入时cast为varchar类型.A库的转码在做数据库连接中设置数据库的编码类型即可. # 中文字符串转为bytes,...
  • 前言 python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍 python 中字符串处理的原理,附带解决 json ...(2)将Unicode转化为某种类型编码,如UTF-8,
  • 前言继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型编码导致数据中文出现乱码...
  • 各种编码类型总结

    千次阅读 2018-08-22 19:15:29
    英文字母: 字节数 : 1;编码:GB2312 字节数 : 1;编码:GBK 字节数 : 1;编码:GB18030 ...编码:ISO-8859-1 ...编码:UTF-8 ...编码:UTF-16 ...编码:UTF-16BE ...中文汉字: 字节数 : 2;编码:GB2312 字节数 : 2...
  • Java编码类型

    2017-05-26 15:54:36
    ISO8859-1:只支持英文 GB2312:支持中文简体 GBK:支持中文简体、繁体 UTF-8:支持中文简体、繁体、多国语言
  • 首先,介绍一下编码类型: 然后,再看一下编码类型的转换过程: python程序是在内存中运行,因此应该处理的是Unicode类型的字符串,文件或终端中的各种编码方式,可以理解为py3中的Bytes类型。 Unicode只能在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,657
精华内容 1,862
关键字:

中文编码类型