厦门建设网站建站做网站费用怎么记分录
web/
2025/10/3 3:45:31/
文章来源:
厦门建设网站建站,做网站费用怎么记分录,软件定制开发是什么意思,电脑上制作网页的软件一、使用中文字符 在python源码中如果使用了中文字符#xff0c;运行时会有错误#xff0c;解决的办法是在源码的开头部分加入字符编码的声明#xff0c;下面是一个例子#xff1a;#!/usr/bin/env python# -*- coding: cp936 -*-Python Tutorial中指出#xff0c;python的… 一、使用中文字符 在python源码中如果使用了中文字符运行时会有错误解决的办法是在源码的开头部分加入字符编码的声明下面是一个例子#!/usr/bin/env python# -*- coding: cp936 -*-Python Tutorial中指出python的源文件可以编码ASCII以外的字符集最好的做法是在#!行后面用一个特殊的注释行来定义字符集# -*- coding: encoding -*-根据这个声明Python会尝试将文件中的字符编码转为encoding编码并且它尽可能的将指定地编码直接写成Unicode文本。注意coding:encoding只是告诉Python文件使用了encoding格式的编码但是编辑器可能会以自己的方式存储.py文件因此最后文件保存的时候还需要编码中选指定的ecoding才行。二、中文字符的存储 str u中文stru\xd6\xd0\xce\xc4str 中文str\xd6\xd0\xce\xc4u中文只是声明unicode实际的编码并没有变。这样子就发生变化了str 中文str\xd6\xd0\xce\xc4str str.decode(gb2312)stru\u4e2d\u6587更进一步s 中文s.decode(gb2312)u\u4e2d\u6587len(s)4len(s.decode(gb2312))2s u中文len(s)4s 中文testlen(s)8len(s.decode(gb2312))6s 中文testlen(s)10len(s.decode(gb2312))7可以看出对于实际Non-ASCII编码存储的字符串python可以正确的识别出其中的中文字符以及中文上下文中的标点符号。前缀“u”表示“后面这个字符串“是一个Unicode字符串”这仅仅是一个声明并不表示这个字符串就真的是Unicode了就好比某正太声称自己已满18岁但实际上他的真实年龄并不确定现在体育界年龄造假可不稀罕幺!那么声明成u有什么作用呢对于Python来说只要你声明某字符串是Unicode它就会用Unicode的一套机制对它进行处理。比方说做字符串操作的时候会动用到内部的Unicode处理函数保存的时候以Unicode字符双字节进行保存。等等。显而易见对于一个实际上并不是Unicode的字符串做Unicode动作的处理是有可能会出问题的。
u前缀只适用于你的字符串常量真的是Unicode的情况。三、中文字符的IO操作 用python处理字符串很容易但是在处理中文的时候需要注意一些问题。比如a 我们是python爱好者print a[0]只能输出“我”字的前半部分要想输出整个的“我”字还需要b a[0:2]print b才行很不方便并且当一段文本中同时有中英文如何处理最好的办法就是转换为unicode。像这样c unicode(a, gb2312)print c[0]这个时候c的下标对应的就是每一个字符不再是字节并且通过len(c)就可以获得字符数还可以很方便的转换为其他编码比如转换为utf-8d c.encode(utf-8)四、type ‘str’和type ‘unicode’type ‘str’将字符串看作是字节的序列而type ‘unicode’则将其看作是字符的序列单个字符可能占用多个字节字节相对于字符其在存储层次中更低一些。str转换为unicode要decode可以这样想因为要把字节序列解释成字符序列字节序列是底层的存放方式解码decode成更高层的字符以便使用同理unicode转换为str要encode就象信息编码encode后才存储一样s.decode(encoding) type str to type unicodeu.encode(encoding) type unicode to type str例如s strtype(s)type strtype(s.decode())type unicodes ustrtype(s)type unicodetype(s.encode())type str处理中文数据时最好采用如下方式1. Decode early尽早decode, 将文件中的内容转化成unicode再进行下一步处理)2. Unicode everywhere (程序内部处理都用unicode)3. Encode late (最后encode回所需的encoding, 例如把最终结果写进结果文件)下面是一个简单的演示用re库查询一个中文字符串并打印p re.compile(unicode(测试(.*), gb2312))s unicode(测试一二三, gb2312)for i in p.findall(s):print i.encode(gb2312)一二三五、跨平台处理技巧 如果一个project必须在两个平台上开发程序应该使用同样的encoding比如要求所有的文件都使用UTF-8如果实在不能统一一般是为了满足许多所谓专家学者莫名其妙的要求可以退而求其次用当前系统编码决定文件内的编码import localeimport stringimport re#根据当前系统的encoding构造需要的编码取值lang string.upper(locale.setlocale(locale.LC_ALL, ))textencoding None 3#检查编码的值是不是满足我们需要的情况if re.match(UTF-8, lang) ! None:# UTF-8编码textencoding utf-8elif re.match(rCHINESE|CP936, lang):# Windows下的GB编码textencoding gb18030elif re.match(rGB2312|GBK|GB18030, lang):# Linux下的GB编码textencoding gb18030else:# 其他情况抛个错误吧raise UnicodeErrorfd file(filename, r)fulltextlist fd.readlines()# 把每一行转换成unicodefor each in len(fulltextlist):fulltextlist[i] unicode(each, textencoding)fd.close()# 如果要打印的话可以用text.encode(encoding)来恢复成多字节编码六、异常处理 编码encoding发生在Unicode字符串转换为字节序列时而解码decoding发生在字节序列转换为Unicode字符串时encoding always takes a Unicode string and returns a bytes sequence, and decoding always takes a bytes sequence and returns a Unicode string。UnicodeDecodeErrorUnicodeDncodeError通常发生在将str字符串解码为特定Unicode字符串时。由于不同的编码只能映射部分str字符串到对应的Unicode字符所以遇到一些字符时解码会失败。UnicodeEncodeErrorUnicodeEncodeError通常发生在将Unicode字符串编码为特定字节序列时。由于不同的编码只能映射部分Unicode字符到对应的str字符串所以遇到一些字符时编码会失败。处理python编码转换时的UnicodeDecodeError异常python提供的unicode转换不像iconv或是mbstowcs之类的方便。如果转换一段unicode(1234中文,ascii) 到utf8会直接出现UnicodeDecodeError的错误。如果在你能预知字串符的编码的时候比如你用unicode(1234中文, gbk) 就不会出现错误不过很多时候会出现CJK混合的情况如果要做到将一段CJK文件转换成unicode可能就行不通了。好在python的codecs提供了register_error这个功能register_error(name, error_handler)原理很简单不过要先看unicode是如何处理异常的。unicode这个函数是将一段string按输入的编码转换成目标的编码如果出现了不与输入编码相符的会出现一个UnicodeDecodeError的异常通常有三种处理方法strict、replace、ignore默认是 strict,就是直接raise UnicodeDecodeError。通过register_error我们也可以有自己的处理方法如果遇到与输入的编码不符的时候我们就自己识别比如GBK、BIG5、JP的字符。def cjk_replace(exc):if not isinstance(exc, UnicodeDecodeError):raise TypeError(dont know how to handle %r % exc)if exc.end 1 len(exc.object):raise TypeError(unknown codec ,the object too short!)ch1 ord(exc.object[exc.start:exc.end])newpos exc.end 1ch2 ord(exc.object[exc.start 1:newpos])sk exc.object[exc.start:newpos]if 0x81ch10xFE and (0x40ch20x7E or 0x7Ech20xFE): # GBKreturn (unicode(sk,cp936), newpos)if 0x81ch10xFE and (0x40ch20x7E or 0xA1ch20xFE): # BIG5return (unicode(sk,big5), newpos)raise TypeError(unknown codec !)codecs.register_error(cjk_replace, cjk_replace)我们的cjk_replace现在只能处理GBK与BIG5的因为我对编码也不是特别了解只是大概知道GBK与BIG5的不太了解JP的。在 cjk_replace这个函数里我们对不认识的文字进行手工识别如果认识的编码就用正确的方法并返回编码后的内容与新的pos比如“1234中文”在pos为4的时候会调用我们的cjk_replace我们会返回一个从gbk转换成utf8的“中”字并返回下个正确的位置“文”的起始位置。当然了处理“文”的时候还会再调用一次。下面看看是如何使用的filedata open(test.txt,r).read() #gbk and big5 filedata unicode(filedata,ascii,cjk_replace).encode(utf8)小结一个比较一般的Python中文处理的流程* 将欲处理的字符串用unicode函数以正确的编码转换为Unicode* 在程序中统一用Unicode字符串进行操作* 输出时使用encode方法将Unicode再转换为所需的编码有几点要说明一下* 所谓“正确的”编码指得是指定编码和字符串本身的编码必须一致。这个其实并不那么容易判断一般来说我们直接输入的简体中文字符有两种可能的编码GB2312GBK、GB18030、以及UTF-8* encode成本地编码的时候必须要保证目标编码中存在欲转换字符的内码。encode这种操作一般是通过一个本地编码对应Unicode的编码转换表来进行的事实上每个本地编码只能映射到Unicode的一部分。但是映射的区域是不同的比如Big-5对应的Unicode的编码范围和 GBK对应的就不一样实际上这两个编码有部分范围是重叠的。所以Unicode的一些字符比如本身就是从GB2312转换来的那些可以映射到 GBK但未必可以映射到Big-5如果你想转换到Big-5很有可能就会出现编码找不到的异常。但UTF-8的码表范围实际上和Unicode是一样的只是编码形式不同而已所以理论上来说任何本地编码的字符都可以被转换到UTF-8* GB2312、GBK、GB18030本质上是同一种编码标准。只是在前者的基础上扩充了字符数量* UTF-8和GB编码不兼容* 出现编解码异常时可能需要自己编写编解码解析函数这需要了解一些字符编码的知识参考资料1、
http://bbs3.chinaunix.net/thread-1389703-1-2.html 2、 Python的中文处理及其它http://www.go4pro.org/?p38 3、 Python处理中文的时候的一些小技巧http://cocre.com/?p461 4、 Unicode In Python, Completely Demystified. Kumar McMillanhttp://farmdev.com/talks/unicode 5、 python中文处理好方法http://www.okpython.com/bbs/viewthread.php?tid311 6、 Python的中文处理http://hi.baidu.com/mrsz/blog/item/7812a5018c2cf2031d9583d2.html 7、 UnicodeDecodeErrorhttp://wiki.python.org/moin/UnicodeDecodeError 8、 UnicodeEncodeErrorhttp://wiki.python.org/moin/UnicodeEncodeError 9、 如何处理python编码转换时的UnicodeDecodeError异常http://blog.chinaunix.net/u/8873/showart_1009737.html 10、codecs — Codec registry and base classeshttp://docs.python.org/library/codecs.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85999.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!