A. 文件里写的是unicode,用python怎么读取成文本
先读到内存,然后根据脚本当前编码decode,然后再encode成你想要的编码
eg:
#假设readString是你读出来的字符串,你想转成gb2312
# -*- coding: utf-8 -*-
readString.decode('utf-8').encode('gb2312') #当前脚本编码为utf-8
B. python怎么转换unicode编码
用decode()就行。decode()方法必须传入一个参数,这个参数就是当前待转码的编码,此函数方法的用意就是将当前编码为Unicode编码。
比如就你这提问的此页面:
#使用版本是python2.
importurllib
url='https://..com/question/1499967322379602619.html?entry=qb_ihome_tag&hideOtherAnswer=true&newAnswer=1'
html=urllib.urlopen(url).read()
result=html.decode('gbk')
printresult
方法是绝对可行的
此法对字符串和文档内容的解码一样有效。
C. 在python中unicode是什么用法
可以打印出中文的
ss=u'网络'
print ss
就可以打印出中文
D. python怎么把unicode码转汉字
普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码: unicodestring = u"Hello world" # 将Unicode转化为普通Python字符串:"encode" utf8string = unicodestring.encode("utf-8")
E. 如何理解python3的unicode,以及全角半角转换
1. unicode是一个编码的standard,表明了字符与数字之间的映射,是可变长的。
2. 映射后的数据如何编码为字节?这个就是具体的编码规则:目前最主流的是UTF-8,同样,它也是变字长的。
python3中的str都是unicode的:“The default encoding for Python source code is UTF-8”
python3中的encode:按照encode()括号中的参数对字符串进行编码,就是生成bytes。
所以:
In:'中文'.encode('utf-8')
Out:b'\xe4\xb8\xad\xe6\x96\x87'
这里的b就是Byte,\x表示这个x是被转义的,意思就是0x。又如:
In: 'abc'.encode('utf-8')
Out: b'abc'
上面的b'a'其实表示的是数字97,b'a'的意思就是字符串'a'的binary数字:
[In]:'abc'.encode('utf-8')[0]
[Out]: 97
同时可以把b'\x'进行解码,即:
In:b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
Out:'中文'
除了encode('utf-8')外,用ord可以获得单个utf-8字符对应的数字:
In [60]: ord('a')
Out[60]: 97
In [61]: ord('a')#这个是全角的a
Out[61]: 65345
除了decode('utf-8')外,用chr可以获得数字对应的utf-8字符:
In [62]: chr(97)
Out[62]: 'a'
除了unicode还有别的编码标准吗?有啊,比如我国的GBK,别名也叫cp936。
全角和半角之分,是指同样一个意义的字符,显示的大小不同.具体来说,全角和半角的编码是两个结果:
In [70]: "mn".encode('utf-8')
Out[70]: b'\xef\xbd\x8d\xef\xbd\x8e
[In]:"mn".encode('utf-8')
[Out]:b'mn'
它们有什么对应关系呢?(引自这里)
转换说明
全角半角转换说明
有规律(不含空格):
全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
特例:
空格比较特殊,全角为 12288(0x3000),半角为 32(0x20)
除空格外,全角/半角按unicode编码排序在顺序上是对应的(半角 + 0x7e= 全角),所以可以直接通过用+-法来处理非空格数据,对空格单独处理。
代码在此基础上改动一下(将unichr改为chr即可,适应python3),即:
def strQ2B(ustring):
"""全角转半角"""
rstring = ""
for uchar in ustring:
inside_code=ord(uchar)
if inside_code == 12288: #全角空格直接转换
inside_code = 32
elif (inside_code >= 65281 and inside_code <= 65374): #全角字符(除空格)根据关系转化
inside_code -= 65248
rstring += chr(inside_code)
return rstring
In [69]: strQ2B('你好python')
Out[69]: '你好python'
F. 如何使用python 打开unicode的文件
Python核心库的open函数是按照ascii设计的。但是,现在我们越来越多地要面对Unicode文件。好在python提供了codecs模块,帮我们解决了这个问题。
codecs模块的open定义如下
open( filename, mode[, encoding[, errors[, buffering]]])
Open an encoded file using the given mode and return a wrapped version providing transparent encoding/decoding.
其中前两个参数filename和mode和默认的open相同。第三个参数encoding是关键,制定了文件的编码方式。
对于常用的Unicode有这几种utf_16、utf_16_le、utf_16_be、utf_8,每一种还有一些可用的别名,具体可以查找python manual。
utf_16、utf_16_le、utf_16_be参数的区别是这样的。
如果指定了utf_16,python会检查文件的BOM(Byte Order Mark)来判断,文件类型到底是utf_16_le、utf_16_be。对于没有BOM的文件会报错。
如果我们直接指定了utf_16_le、utf_16_be,python就不检查BOM了。对于没有BOM的文件很好用。但是,对于有BOM的文件就要注意,它会把BOM当作第一个字符读入。
G. python3 pickle中怎么使用unicode编码
Python特有编码
Python还内置一些特有的编码集。
4.2.4.1 文本编码
Python提供了下面从字符串到字节数组的编码,以及字节数据到字符串的解码:
Codec
Aliases
Purpose
idna
Implements RFC 3490, see also encodings.idna. Only errors='strict' is supported.
mbcs
dbcs
Windows only: Encode operand according to the ANSI codepage (CP_ACP)
palmos
Encoding of PalmOS 3.5
punycode
Implements RFC 3492. Stateful codecs are not supported.
raw_unicode_escape
Latin-1 encoding with \uXXXX and \UXXXXXXXX for other code points. Existing backslashes are not escaped in any way. It is used in the Python pickle protocol.
undefined
Raise an exception for all conversions, even empty strings. The error handler is ignored.
unicode_escape
Encoding suitable as the contents of a Unicode literal in ASCII-encoded Python source code, except that quotes are not escaped. Decodes from Latin-1 source code. Beware that Python source code actually uses UTF-8 by default.
unicode_internal
Return the internal representation of the operand. Stateful codecs are not supported.
Deprecated since version 3.3: This representation is obsoleted by PEP 393
4.2.4.2 二进制编码转换
Python提供下面的二进制编码转换:字节对象到字节对象映射转换,不支持使用bytes.decode()。
Codec
Aliases
Purpose
Encoder / decoder
base64_codec [1]
base64, base_64
Convert operand to MIME base64 (the result always includes a trailing '\n')
Changed in version 3.4: accepts any bytes-like object as input for encoding and decoding
base64.b64encode() / base64.b64decode()
bz2_codec
bz2
Compress the operand using bz2
bz2.compress() / bz2.decompress()
hex_codec
hex
Convert operand to hexadecimal representation, with two digits per byte
base64.b16encode() / base64.b16decode()
quopri_codec
quopri, quotedprintable, quoted_printable
Convert operand to MIME quoted printable
quopri.encodestring() / quopri.decodestring()
uu_codec
uu
Convert the operand using uuencode
uu.encode() / uu.decode()
zlib_codec
zip, zlib
Compress the operand using gzip
zlib.compress() / zlib.decompress()
4.2.4.3 文本编码转换
下面编解码器支持字符串到字符串的转换:
Codec
Aliases
Purpose
rot_13
rot13
Returns the Caesar-cypher encryption of the operand
4.2.5 encodings.idna--国际化域名的应用
本模块实现了RFC 3490(Internationalized Domain Names in Applications)和RFC 3492(Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN) 的功能。它实现的功能建立在punycode编码和stringprep模块之上。
这两个RFC定义了非ASCII字符表示域名的规范。如果一个域名含有非ASCII字符,需要把它转换为ASCII兼容编码的域名(ACE),因为有一些网络协议不支持非ASCII字符的域名,比如DNS查询、HTTP主机等等。因此这些转换工作可以人工转换,也可以是程序转换。在程序里转换,需要把UNICODE的域名转换为ACE兼容的域名之后,才能进行处理,当要给用户显示时需要从ACE反向转换为UNICODE域名。
Python提供了好几种方法来做转换的工作:使用idna编解码来操作UNICODE与ACE之间相互转换;把输入字符串分离成标记,然后通过RFC3490进行查表,再合并成相应的域名;最后一种是把输入字符串分成标记,通过ACE标记转换。在socket模块里,就透明地实现了从UNICODE主机名称转换为ACE域名,所以应用程序在调用这个模块时就不需要考虑UNICODE域名转换为ACE域名的工作了。基于socket模块之上的功能,比如http.client和ftplib都可以接受UNICODE域名。
当从网络收到的域名,它是不会自动转换为 UNICODE域名的,需要应用程序进行转换之后,才能以UNICODE域名显示给用户。
模块encodings.idna也实现nameprep的处理,它能实现主机名称的标准化处理,域名的大小写统一化,如果需要这些功能是可以直接使用。
encodings.idna.nameprep(label)
返回label的国际化标志名称。
encodings.idna.ToASCII(label)
转换label为ASCII表示,符合标准RFC 3490。
encodings.idna.ToUnicode(label)
转换label为UNICODE表示,符合标准RFC 3490.
4.2.6 encodings.mbcs--Windows的ANSI编码
本模块实现从ANSI(CP_ACP)代码进行编码的功能。仅在Windows系统上可用。
4.2.7 encodings.utf_8_sig-UTF-8带BOM标记的codec编码
本模块实现UTF-8的编码和解码:把带有BOM的UTF-8编码转换为不带BOM的UTF-8编码。当在生成BOM时,只在第一次时生成;当在解码时跳过相应的BOM标记字节,再进行解码。
H. Python如何将Unicode中文字符串转换成 string字符串
Unicode字符串可以用多种方式编码为普通字符串,假设unicodestring = u"Hello world",依照所选择的编码(encoding),如下:
1、#将Unicode转换成普通的Python字符串:"编码(encode)"。
(8)unicode码在python里怎么用扩展阅读:
Python转换字符和字符串的原因:为了处理不适合用ASCII字符集表示的数据。
在以ASCII码为中心的语言和环境中,字节和字符被当做相同的事物。由于一个字节只能有256个值,这些环境就受限为只支持256个字符Unicode码,另一方面,有数万个字符,那意谓着每个Unicode字符占用多个字节,因此,你需要在字符和字节之间作出区别。
(1)UTF-8编码能处理任何的Unicode字符。它也是与ASCII码向后兼容的,因此一个纯粹的ASCII码文件也能被考虑为一个UTF-8文件,而且一个碰巧只使用ASCII码字符的 UTF-8文件和拥有同样字符的ASCII码文件是相同的。
这个特性使得UTF-8的向后兼容性非常好,尤其使用较旧的Unix工具时。UTF-8 无疑地是在 Unix上的占优势的编码。它主要的弱点是对东方文字是非常低效的。
(2)UTF-16编码在微软的操作系统和java环境下受到偏爱。它对西方语言是比较低效,但对于东方语言是更有效率的。一个UTF-16 的变体有时叫作UCS-2 。
(3)ISO-8859编码系列是256个字符的ASCII码的超集。他们不能够支援所有的Unicode码字符;他们只能支援一些特别的语言或语言家族。
ISO-8859-1,也既Latin-1,包括大多数的西欧和非洲语言,但是不含阿拉伯语。ISO-8859-2,也既Latin-2,包括许多东欧的语言,像是匈牙利语和波兰语。
I. Python2.7 中文字符编码,使用Unicode时,选择什么编码格式
关于编码和乱码的问题,我简单讲一下。
通常问这类问题的人是混淆了若干个不同的概念,并且他们自己也没有意识到自己混淆了这些概念的。
终端显示字符的编码(windows下终端是cmd,linux下是各种terminal,远程登录是putty或者xshell)
shell环境的编码。比如中文版windows用的是gbk(向下兼容gb2312),大多数linux发行版使用的是utf-8(LANG=zh_CN.UTF-8)。
文本文件的编码。这个通常取决于你的编辑器,而且有的编辑器支持多种编码的话,你可以在文本开头位置指定编辑器使用特定编码。比如# -*- coding: utf8 -*-,vim看到这行会默认将这个脚本认定为utf-8兼容编码格式。
应用程序的内部编码。一个字符串,作为数据只是一个字节数组,但是作为字符的数组,就有一个解析方式。java和python的内部字符编码是utf-16,python和java都支持用不同的编码来对字节数组进行decode来得到字符数组。
拿题主的问题来解释一下。
我在ubuntu kylin中文环境下默认terminal中做了同样的实验,但是结果和题主恰好相反:
题主现在弄了一个文件,在开始加上了
# -*- coding: utf8 -*-
这下编辑器看到了,知道这文件是utf-8的了。所以编辑器对读入的一坨坨字节用utf-8来解码,对于输出到磁盘的汉字也用utf-8来编码。所以你在文件里面看到的看上去像“汉字”的东西,就和第一种情况下想同了,当然代码就跑得通。
顺便说一下,如果编辑器无视行首这行编码声明,或者编辑器无法支持utf-8格式,那么你弄好的文件在那个编辑器下就会显示乱码,多么简单的道理啊。
终端和环境的编码一致(本机通常是一致的,不一致常常出现在远程登录);如果不一致就需要有编辑器或者文本阅读器做一个兼容两者的转换。
编辑器能够认识文本编码
系统拥有能显示这种字符的字体。
这也就是我为什么一直反对在程序文本中使用除ascii之外的所有编码字符的原因。环境太复杂了,绕开问题远比解决问题轻松。
J. python中怎样将unicode转换成原来的中文
python默认就是unicode存储。如果是从文件读取的,在open的参数中指定encoding关键字参数就行。如下:
#coding=utf-8/importjson /defLoadQuestion(): /f=open("test.json",'r') qas=json.load(f) question=qas['documents'] /returnquestion/t=LoadQuestion() /printstr(t).decode("unicode-escape")
通常python2时所有IO读写都是byte方式。也就是编码后的。java也是这样子。只有python3还有某些特定的模块才会自动将byte重新转换成unicode
在python2里的确可以使用s.decode('gbk','ignore')之类的变成unicode。不过在python3里应该是这样子, s.encode('gbk','ignore')这样就变成了byte
如果你喜欢 utf-8,可以s.encode(‘utf-8','ignore')和s.decode(‘utf-8','ignore')