弱弱的问一下,python中文怎么韩语发音表中文对照表

python(16)
总是有人问”python乱码”问题,在这里,我做一下解答,希望以后有遇到类似问题的人,能自行解决。
最近在学习写smtp+pop3客户端,由于发/收的邮件中的中文都是乱码,于是百度,看到上面这个截图,多次尝试,乱码问题解决,后面讲我的解决过程。
乱码根本原因在于“编码-解码不一致”
python中,我们使用decode()和encode()来进行解码和编码,&在python中,使用unicode类型作为编码的基础类型。即
显示数据两个来源:源代码引用的外部数据(socket,file,raw_input)、源代码内部的数据
数据源编码:是指源代码引用外部数据,外部数据编码需要与显示程序编码一致,例如源代码使用socket对网页抓包,网页数据即为数据源,而网页本身是有特定编码的。
源代码编码:python源代码默认使用ASCII编码,当部分字符无法ASCII编码时,默认使用用户申明的编码例如#&encoding:&utf-8,如果不申明,可能会因编辑器的不同,打开源代码出现乱码情况。源代码编码需要与显示程序编码一致。
显示编码:黑白显示器只能显示黑白,如果输入彩色信号也是如此,显示输出的程序对编码同样有要求,要显示的数据需要与显示程序要求的编码一致。
常见显示编码:在windows中,如果双击python***.py文件,则默认调用python&shell解释,并使用windows&cmd&shell(cp936编码)程序做输出,在linux终端SecureCRT显示数据通常设置使用utf-8编码,python自带的IDLE在windows下默认使用cp936编码。
编码一致:通过上面描述我们知道【显示数据编码需要与显示数据程序编码一致】,那么如何一致呢?需要通过中间编码unicode实现一致:源编码—&unicodeà—&目标编码
例如网页常使用gb2312编码(数据源utf-8编码暂不考虑),*.py源代码通常使用utf-8编码,显示端初学者学用windows&cmd&的cp936编码,要保持一致可如此修改print‘string’语句:&&(string来自网页)&&&&&&&&&&&&&print‘string’.decode(‘GB2312’).encode(‘cp936’).
其中‘string’.decode(‘GB2312’)à变为unicode,而*.encode(‘cp936’)则让unicode编码à显示端的cp936编码。
解决思路:
查看编码信息:
我使用poplib抓取邮件信息,了解到邮件使用GB2312编码
想要对网页数据抓取的朋友,必须对网页的编码信息准确获取。对目标网站源代码做如下搜索即可发现编码方式:
&meta&http-equiv=&content-type&&content=&text/charset=utf-8&&
数据传输编码
正确解码:
编码与解码关系
一个比喻:编码是如何保存的问题,解码是如何显示的问题。
Window编码解码流程:
源代码解码:
ASCII/utf-8&-&unicode(str.&decode('utf-8'))-&cp936(str.&encode('cp936'))
数据类型:ASCII/utf-8(&type&‘str’&)&;unicode(&type&‘unicode’&)&;cp936(&type&‘str’&)
cp936为unicode是中文子集,因此unicode已经可以在windows下正确显示。
源代码引用外部数据解码:
假设外部数据使用xx编码:xx&àunicodeàcp936
python中的编码与解码
Python&源代码默认编码为ASCII码,在源代码申明utf-8后,发生了编码过程非ASCII字符àutf-8.&&
先说一下python中的字符串类型,在python中有两种字符串类型,分别是str和unicode,他们都是basestring的派生类;str类型是一个包含Characters&represent&(at&least)&8-bit&bytes的序列;unicode的每个unit是一个unicode&所以:
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等;(当编解码不一致时,通常用unicode作为中转)
一些实例:
eg1.&源代码编码
此例中变量s,与print&s的显示环境linux&bash&shell都使用相同的编码utf-8编码,因此没有出现乱码。
编程过程:utf-8&/ASCIIàpython&shell传递给linux&bash&shell(使用utf-8解码)显示
注意unicode(变量,’utf-8)&/&u”string”与默认ASCII编码的区别&
eg2.将eg1中的代码使用windows环境运行,结果出现乱码,这是因为,变量s为ASCII编码,而windows&cmd&shell作为显示程序&使用cp936编码显示,当然乱码
编码过程:utf-8/ASCIIàcmd&shell(cp936解码)显示
解决办法,让输出的ASCII/utf-8编码转码为cp936编码,乱码解决
eg&3.邮件编码(数据源编码)
翻阅历史邮件,查询编码方式
正确解码:GB2312à’string’.decode(‘GB2312’)àunicodeàutf-8
技巧与方法:
sys.defaultencoding模块
&Python&使用sys.defaultencoding&的默认编码ASCII编码解码,但变量s的编码为utf-8编码,因此报错。
解决办法一:明确指定解码方式
解决办法&二:设置默认解码方式sys.setdefaultencoding('utf-8')
codecs.open()方法
用于解决文件读写时的编码问题
Python3的编码
在新版本的python3中,取消了unicode类型,代替它的是使用unicode字符的字符串类型(str),字符串类型(str)成为基础类型如下所示,而编码后的变为了字节类型(bytes)但是两个函数的使用方法不变:
&&&&&decode&&&&&&&&&&&&&&encode
bytes&------&&str(unicode)------&bytes
u&=&'中文'&#指定字符串类型对象u,默认为unicode编码
str&=&u.encode('gb2312')&#以gb2312编码对u进行编码,获得bytes类型对象str
u1&=&str.decode('gb2312')#以gb2312编码对字符串str进行解码,获得字符串类型对象u1
u2&=&str.decode('utf-8')#如果以utf-8的编码对str进行解码得到的结果,将无法还原原来的字
&参考文章:
http://blog.csdn.net/turkeyzhou/article/details/8927361
http://blog.chinaunix.net/uid-517401-id-353375.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7840次
排名:千里之外
原创:31篇
(3)(1)(15)(4)(7)(2)简单解决Python文件中文编码问题
投稿:hebedich
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了简单解决Python文件中文编码问题的相关资料,需要的朋友可以参考下
需要读取utf-8编码的中文文件,先利用sublime text软件将它改成无DOM的编码,然后用以下代码:
with codecs.open(note_path, 'r+','utf-8') as f:
line=f.readline()
print line
这样就可以正确地读出文件里面的中文字符了。
同样的,如果要在创建的文件中写入中文,最好也和上面差不多:
with codecs.open(st,'a+','utf-8') as book_note:
book_note.write(st)
创建中文文件
然后以读出的字符为文件名,创建文件。
如果直接用上面读出来的字符串创建文件,则会出现:
st=digest_path+"\\"+onenote[0]+".txt"
with open(st,'a+') as book_note:
经过调试,应该是最后一个换行符的问题,在生成名字的时候,将字符trip一下,就能够得到文件:
st=digest_path+"\\"+onenote[0].strip()+".txt"
中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢?
我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各种编码,比如作为中国程序经常要面对的gbk,gb2312,utf8等,那这些编码是怎么转换成内部的unicode呢?
首先我们先看一下源代码文件中使用字符串的情况。源代码文件作为文本文件就必然是以某种编码形式存储代码的,python默认会认为源代码文件是asci编码,比如说代码中有一个变量赋值:
python认为这个'a'就是一个asci编码的字符。在仅仅使用英文字符的情况下一切正常,但是如果用了中文,比如:
这个代码文件被执行时就会出错,就是编码出了问题。python默认将代码文件内容当作asci编码处理,但asci编码中不存在中文,因此抛出异常。
解决问题之道就是要让python知道文件中使用的是什么编码形式,对于中文,可以用的常见编码有utf-8,gbk和gb2312等。只需在代码文件的最前端添加如下:
# -*- coding: utf-8 -*-
这就是告知python我这个文件里的文本是用utf-8编码的,这样,python就会依照utf-8的编码形式解读其中的字符,然后转换成unicode编码内部处理使用。
不过,如果你在Windows控制台下运行此代码的话,虽然程序是执行了,但屏幕上打印出的却不是哈字。这是由于python编码与控制台编码的不一致造成的。Windows下控制台中的编码使用的
是gbk,而在代码中使用的utf-8,python按照utf-8编码打印到gbk编码的控制台下自然就会不一致而不能打印出正确的汉字。
解决办法一个是将源代码的编码也改成gbk,也就是代码第一行改成:
# -*- coding: gbk -*-
另一种方法是保持源码文件的utf-8不变,而是在'哈'前面加个u字,也就是:
这样就可以正确打印出'哈'字了。
这里的这个u表示将后面跟的字符串以unicode格式存储。python会根据代码第一行标称的utf-8编码识别代码中的汉字'哈',然后转换成unicode对象。如果我们用type查看一下'哈'的数据类型type(‘哈'),会得到&type ‘str'&,而type(u'哈'),则会得到&type ‘unicode'&,也就是在字符前面加u就表明这是一个unicode对象,这个字会以unicode格式存在于内存中,而如果不加u,表明这仅仅是一个使用某种编码的字符串,编码格式取决于python对源码文件编码的识别,这里就是utf-8。
Python在向控制台输出unicode对象的时候会自动根据输出环境的编码进行转换,但如果输出的不是unicode对象而是普通字符串,则会直接按照字符串的编码输出字符串,从而出现上面的现象。
使用unicode对象的话,除了这样使用u标记,还可以使用unicode类以及字符串的encode和decode方法。
unicode类的构造函数接受一个字符串参数和一个编码参数,将字符串封装为一个unicode,比如在这里,由于我们用的是utf-8编码,所以unicode中的编码参数使用'utf-8′将字符封装为
unicode对象,然后正确输出到控制台:
s1=unicode(‘哈', ‘utf-8′)
另外,用decode函数也可以将一个普通字符串转换为unicode对象。很多人都搞不明白python字符串的decode和encode函数都是什么意思。这里简要说明一下。
decode是将普通字符串按照参数中的编码格式进行解析,然后生成对应的unicode对象,比如在这里我们代码用的是utf-8,那么把一个字符串转换为unicode就是如下形式:
s2='哈'.decode(‘utf-8′)
这时,s2就是一个存储了'哈'字的unicode对象,其实就和unicode(‘哈', ‘utf-8′)以及u'哈'是相同的。
那么encode正好就是相反的功能,是将一个unicode对象转换为参数中编码格式的普通字符,比如下面代码:
s3=unicode(‘哈', ‘utf-8′).encode(‘utf-8′)
s3现在又变回了utf-8的'哈'。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具11583人阅读
python(12)
可爱的python学习总结(6)
今儿再写脚本的时候,运行报错:
SyntaxError: Non-ASCII character '\xe4' in file getoptTest.py on line 14, but
see http://www.python.org/peps/pep-0263.html for details
果断上网查找,后发现是中文注释的问题既然它提供了网址,那就看看吧。简单地浏览一下,终于知道如果文件里有非ASCII字符,需要在第一行或第二行指定编码声明。把ChineseTest.py文件的编码重新改为ANSI,并加上编码声明:修改的方法是:
这里本人试过好多次了,必须是在第一行或是第二行加入这么一句:否则无效,这里还要提醒一点儿就是查看vim的编码命令:set fileencoding
-*- coding: utf-8 -*-
#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8
import os,sys
import getopt
print sys.argv
CDROW='/root/home/test'
def cdWalker(CDROW,cdfile):
for root,dirs,files in os.walk(CDROW):
result.append(&%s %s %s& %(root,dirs,files))
open(cdfile,'w').write('\n'.join(result))
def usage():
print '''pycdc 使用方式:
python cdays-3-exercise-1.py -d cdc -k 中国火
#检索cdc中有没有中国火字样的目录,
结果显示:
zhouqian@zhou:~/python$ python getoptTest.py
['getoptTest.py']
pycdc 使用方式:
python cdays-3-exercise-1.py -d cdc -k 中国火
#检索cdc中有没有中国火字样的目录,
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:333022次
积分:4465
积分:4465
排名:第5008名
原创:120篇
转载:47篇
评论:52条
(1)(3)(3)(1)(1)(3)(1)(3)(1)(4)(2)(4)(5)(1)(13)(17)(18)(4)(9)(1)(5)(13)(19)(15)(8)(2)(4)(4)(2)(python培训视频)
第三方登录:
老是遇到编码问题,快折腾死了,找到一篇不错的,转载一下
这个问题在python3.0里已经解决了。
这有篇很好的文章,可以明白这个问题:
为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
代码中字符串的默认编码与代码文件本身的编码一致。
如:s='中文'
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需 要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默 认编码创建的代码文件。
如果字符串是这样定义:s=u'中文'
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
isinstance(s, unicode)
#用来判断是否为unicode
用非unicode编码形式的str来encode会报错
如何获得系统的默认编码?
#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()
该段程序在英文WindowsXP上输出为:ascii
在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。
如在UliPad中运行如下代码:
会提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是 ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。
将最后一句改为:print s.encode('gb2312')
则能正确输出“中文”两个字。
若最后一句改为:print s.encode('utf8')
则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。
unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码
使用str.__class__可以查看str的编码形式
python是个容易出现编码问题的语言。所以,我按照我的理解写下下面这些文字。
=首先,要了解几个概念。=
*字节:计算机数据的表示。8位二进制。可以表示无符号整数:0-255。下文,用“字节流”表示“字节”组成的串。
*字符:英文字符“abc”,或者中文字符“你我他”。字符本身不知道如何在计算机中保存。下文中,会避免使用“字符串”这个词,而用“文本”来表
示“字符”组成的串。
*编码(动词):按照某种规则(这个规则称为:编码(名词))将“文本”转换为“字节流”。(在python中:unicode变成str)
*解码(动词):将“字节流”按照某种规则转换成“文本”。(在python中:str变成unicode)
**实际上,任何东西在计算机中表示,都需要编码。例如,视频要编码然后保存在文件中,播放的时候需要解码才能观看。
unicode:unicode定义了,一个“字符”和一个“数字”的对应,但是并没有规定这个“数字”在计算机中怎么保存。(就像在C中,一个整数既
可以是int,也可以是short。unicode没有规定用int还是用short来表示一个“字符”)
utf8:unicode实现。它使用unicode定义的“字符”“数字”映射,进而规定了,如何在计算机中保存这个数字。其它的utf16等都是
unicode实现。
gbk:类似utf8这样的“编码”。但是它没有使用unicode定义的“字符”“数字”映射,而是使用了另一套的映射方法。而且,它还定义了如何在
计算机中保存。
=python中的encode,decode方法=
首先,要知道encode是 unicode转换成str。decode是str转换成unicode。
下文中,u代表unicode类型的变量,s代表str类型的变量。
u.encode('...')基本上总是能成功的,只要你填写了正确的编码。就像任何文件都可以压缩成zip文件。
s.decode('...')经常是会出错的,因为str是什么“编码”取决于上下文,当你解码的时候需要确保s是用什么编码的。就像,打开zip文
件的时候,你要确保它确实是zip文件,而不仅仅是伪造了扩展名的zip文件。
u.decode(),s.encode()不建议使用,s.encode相当于s.decode().encode()首先用默认编码(一般是
ascii)转换成unicode在进行encode。
=关于#coding=utf8=
当你在py文件的第一行中,写了这句话,并确实按照这个编码保存了文本的话,那么这句话有以下几个功能。
1.使得词法分析器能正常运作,对于注释中的中文不报错了。
2.对于u&中文&这样literal string能知道两个引号中的内容是utf8编码的,然后能正确转换成unicode
3.&中文&对于这样的literal string你会知道,这中间的内容是utf8编码,然后就可以正确转换成其它编码或unicode了。
没有写完,先码那么多字,以后再来补充,这里不是wiki,太麻烦了。
=Python编码和Windows控制台=
我发现,很多初学者出错的地方都在print语句,这牵涉到控制台的输出。我不了解linux,所以只说控制台的。
首先,Windows的控制台确实是unicode(utf16_le编码)的,或者更准确的说使用字符为单位输出文本的。
但是,程序的执行是可以被重定向到文件的,而文件的单位是“字节”。
所以,对于C运行时的函数printf之类的,输出必须有一个编码,把文本转换成字节。可能是为了兼容95,98,
没有使用unicode的编码,而是mbcs(不是gbk之类的)。
windows的mbcs,也就是ansi,它会在不同语言的windows中使用不同的编码,在中文的windows中就是gb系列的编码。
这造成了同一个文本,在不同语言的windows中是不兼容的。
现在我们知道了,如果你要在windows的控制台中输出文本,它的编码一定要是“mbcs”。
对于python的unicode变量,使用print输出的话,会使用sys.getfilesystemencoding()返回的编码,把它变成str。
如果是一个utf8编码str变量,那么就需要 print s.decode('utf8').encode('mbcs')
最后,对于str变量,file文件读取的内容,urllib得到的网络上的内容,都是以“字节”形式的。
它们如果确实是一段“文本”,比如你想print出来看看。那么你必须知道它们的编码。然后decode成unicode。
如何知道它们的编码:
1.事先约定。(比如这个文本文件就是你自己用utf8编码保存的)
2.协议。(python文件第一行的#coding=utf8,html中的&meta&等)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3351次
排名:千里之外
(1)(1)(1)(2)(3)}

我要回帖

更多关于 中文发音器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信