2006年11月20日 星期一 17:58
请问使用python的socket module发送unicode的信息怎么发送,我试着转换了一下,发送到服务器端还是ascii的,可以看看我的源程序,谢谢。 import socket import sys reload(sys) sys.setdefaultencoding('utf-8') host = "192.168.3.111" port = 8888 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect((host, port)); str = u'' s.send(str) date = s.recvfrom(4096) s.close() print repr(date)
2006年11月20日 星期一 19:49
On 11/20/06, 隋刚 <blackjacksg在gmail.com> wrote: > 请问使用python的socket module发送unicode的信息怎么发送,我试着转换了一下,发送到服务器端还是ascii的,可以看看我的源程序,谢谢。 > > import socket > import sys > reload(sys) > sys.setdefaultencoding('utf-8') > host = "192.168.3.111" > port = 8888 > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) > s.connect((host, port)); > str = u'' > s.send(str) > date = s.recvfrom(4096) > s.close() > print repr(date) 先转为utf-8之类的再传输。不能直接传unicode的。 -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2006年11月21日 星期二 08:02
这是我以前推荐公司开发JSP使用UTF-8编码的帖子,你看看吧,可以了解一下偶的定义,处理编码和传输编码。因为是内部文档,所以看看就算了,谁都不要转载哦。谢谢。 在JSP中选择文件字符集 一、已有的字符集 为了在计算机上存储和表现多种不同的语言,出现了字符集的概念。最早的字符集是由美国制定的ASCII字符集,现在已有多种不同的字符集用来表现更多的语言。比如西方的字符集就有很多种,比较通用的是ISO-8859-1的西方字符集。中文字符集也有多种,有随着不同阶段发展的产物,也有由于海峡两岸不统一的产物。比如中文简体字符集最早的是1980年制定《国家标准信息交换汉字编码GB-2312》,即GB2312字符集。后来为了兼容GB2312并包含繁体中文,产生了GBK字符集。随着后来国际化字符集的发展,又出现了兼容UCS字符集的GB18030字符集。台湾地区也有BIG5字符集。 早期的计算机上只处理以字节为单位的字符串,比如早期的ASCII字符集只使用了一个字节中的7位。后来欧洲部分国家的要求之下将高128位也使用了。但是后来其他国家,尤其是亚洲国家要求非常巨大的字符集空间,所以也就形成了各自的字符集。这时的各个字符集之间互不兼容。亚洲语系由于拥有大量的字符,所以也造成了扩大字符集的需要。比较突出的亚洲字符集问题叫CJK问题,指:中国China、日本Japan、韩国Korea。1993年ISO为了便于世界各地的语言交流,指定了UCS标准。UCS标准使用32位,即4个字节表示一个字符,有着非常巨大的编码空间。UCS在表现了世界上所有的语言、符号,甚至一些文档标准的格式控制符的情况下仍然有巨大的剩余编码空间。另外,UCS标准虽然空间巨大,定宽的编码也使得处理速度非常快,但是在表示现有语言的情况下显得有些浪费,而且保存UCS编码的所有字符也需要非常大的空间,实现起来有一定的难度。UCS的设计过于理想,实现有相当的难度,至今还没有完整的实现。 与此同时,各大IT公司也同样意识到了语言通用的问题,也在90年代初期推出了Unicode字符集。Unicode字符集使用16位,即2个字节表示一个字符。Unicode字符集用来保存世界上现有的大多数语言还是比较合适的。Unicode标准得到了绝大多数IT公司的支持,因此现在推广较好。在微软的Windows 2000以及其后的操作系统中,系统内核就是以Unicode处理字符串的。在最新的ISO C 99标准中,也添加了对Unicode支持的字符类型,即wchar。 经过Unicode十几年的推广,现在的大多数的软件系统都使用了Unicode作为内部的处理字符集。所以,现在新开发的软件系统也应该尽量兼容国际标准,使得软件具有更大的兼容性。 字符集分为处理字符集和交换字符集(为了说明而使用的一个并不规范的定义)。处理字符集是在软件内核中用于运算的字符集,现代的软件大多使用Unicode字符集,所以也推荐使用Unicode字符集。交换字符集是指存储在媒体上或者用于传输的字符集。Unicode字符集作为一种等宽字符集在表现和处理速度上都有很好的性能,但是唯独不太适合于存储和传输,所以需要有一种传输字符集。 比较老的软件系统有相当数量都是使用C/C++编写而成的,即使不是直接使用C语言的系统,也有可能其支持软件,甚至虚拟机是C/C++书写的。而C/C++中的字符串处理依靠字符"\0"来表示字符串的结束。所以对于Unicode字符集,如果高字节或低字节为"\0",则会切断字符串。为了保持这种C/C++的兼容性,出现了UTF-8字符集。UTF-8字符集使用了变长字符表示,最短3字节,最长6字节,用于存储和传输Unicode字符集的字符串。UTF-8编码可以确保字符串中不会出现有意义的"\0",而很好的兼容了已有的软件系统。 现对Eclipse 3.1.2中允许选择的字符集做一个介绍。 ・ISO-8859-1 西方字符集,使用1个字节(8位)来保存一个字符。很多西方出产的软件系统的默认字符集就是ISO-8859-1。包括Apache Tomcat。最多只能保存255种字符,不能作为国际化字符集。 ・US-ASCII 美国标准字符集。使用7位保存一个字符,高位原用于校验和,现在使用0,如果出现最高位为1的情况则出错。最多保存127种字符,不能作为国际化字符集。 ・UTF-16 Unicode的一种编码方式,是Universal Transformation Format的缩写。用4到6个字节表示一个字符,是变长字符集。使用不多,因为既不能很好的兼容C/C++程序,也不能高效的存储Unicode字符。 ・UTF-16BE 因为涉及到了多字节编码,就有了字节序的概念。BE指Big Endian,指大端字节序,高位放在高字节。 ・UTF-16LE LE指Littel Endian,小端字节序,高位放在低字节。 ・UTF-8 使用3-6个字节表示一个字符的变长字符集,现在较为通用的Unicode传输和存储使用的字符集。本文推荐。 ・GBK 现在实施上的中文编码标准,Windows内核中对字符的处理使用了Unicode,但是在用于存储和传输时使用的默认编码格式就是GBK。GBK产生与1995年,是对GB2312的扩充,在现代的软件系统中,凡是可以用GB2312字符集的地方都可以替换为GBK编码来提供更多的字符。GBK编码在Eclipse中并不是列表中的选择项,而是从操作系统中读取的默认编码。 二、中文乱码问题 在不同的软件系统中传输带有字符串的数据时,常常遇到乱码问题,不仅仅是中文,其他亚洲字符,如日文、韩文和越南文都有类似的问题。本文只讨论中文乱码问题。乱码的产生是由于对同一内容所使用的编码字符集和解码字符集不同所引起的。由于字符串并不含有元信息(metadata)来指定其所用的字符集,所以在一般的软件系统中都需要用户明确的指定所用的字符集。 在出现乱码问题时常常会显示一些无意义字符串,或者是方框等等,不同的软件系统对无法解码的字符有不同的表示方式。 如果所有的软件系统都使用相同的编码字符集,则没有这么多乱码问题。但是一些公司为了自己的利益,而偏偏不使用通用的字符集,使得软件和数据的移植中乱码问题重重,进而打压对手的产品。比较典型的是微软一直使用GBK字符集,而不是比较通用的UTF-8字符集。 三、Unicode Unicode作为UCS的一个子集,也可以表示大多数语言符号。已经成为了字符集的国际标准,在处理和使用中有诸多便利。成为大多数软件的内核字符处理用的字符集。现在仍然没有使用Unicode作为内核字符集的一个严重的例子是linux,预计在未来几年也可以移植。Unicode字符类型已经成为很多编程软件的内置类型。如最新版本的C语言标准,ISO C 99标准中的wchar类型就是用于存储Unicode类型的,Java中的所有字符都是Unicode类型的。其他很多编程语言使用了C语言的方式,即同时支持8bit和16bit字符集。在处理上不识别字符的意义,而只是按照一定的存储宽度来处理。 四、可移植性 为了兼容大多数软件系统,在传输和存储中使用UTF-8字符集还是有必要的。因为UTF-8字符集实际保存的是Unicode编码,可以支持世界上几乎所有的语言符号。而且,尽管微软相关的软件系统没有使用UTF-8作为默认编码,但是却可以自动识别并处理UTF-8字符集。所以如果在产品的开发过程中使用GBK编码,则移植到其他软件系统可能出现乱码。但是如果使用了UTF-8编码,则可以在微软和非微软系统上同时很好的显示。所以使用UTF-8编码是一种提高兼容性的好办法。 对于一些不是太成熟的开放源代码软件,甚至只接受UTF-8编码的字符串。对于没有在内核中提供Unicode支持的Linux内核实际上也是可以处理UTF-8字符集的。至少在Linux的应用软件中使用UTF-8仍然是很通用的。至于其他的类Unix系统,则大多数已经完成了向Unicode的移植工作,并以UTF-8作为传输和存储编码。对Unicode和UTF-8等等国际化支持较好的类Unix是FreeBSD。 五、我们的选择 综上所述,本次系统开发中推荐使用UTF-8编码字符集。仅此一项改变可以让我们的系统在未来的移植过程中将编码字符集的问题减小到最低的水平,而所付出的代价仅仅限于修改一些软件的配置。包括Eclipse中的编辑器缺省字符集和Lomboz的JSP缺省字符集。而对于Windows记事本等等软件则可以不经过设置直接打开并很好的显示UTF-8编码的文件。 -- 从前有一只很冷的毛毛虫,他想获得一点温暖。而获得温暖的机会只有从树上掉下来,落进别人的领口。 片刻的温暖,之后便失去生命。而很多同类却连这片刻的温暖都没有得到就.. 我会得到温暖么?小心翼翼的尝试,却还是会受到伤害。 我愿为那一刻的温暖去拼,可是谁愿意接受? 欢迎访问偶的博客: http://blog.csdn.net/gashero -------------- next part -------------- An HTML attachment was scrubbed... URL: http://python.cn/pipermail/python-chinese/attachments/20061121/fe8d72ba/attachment.html
2006年11月21日 星期二 09:02
unicode编码和解码对于ascii实际上没有什么意义。通过socket传输数据,socket并不关心传输的是什么编码格式,它只知道传输的时一个字节流。 On 11/20/06, 隋刚 <blackjacksg at gmail.com> wrote: > 请问使用python的socket module发送unicode的信息怎么发送,我试着转换了一下,发送到服务器端还是ascii的,可以看看我的源程序,谢谢。 > > import socket > import sys > reload(sys) > sys.setdefaultencoding('utf-8') > host = "192.168.3.111" > port = 8888 > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) > s.connect((host, port)); > str = u'' > s.send(str) > date = s.recvfrom(4096) > s.close() > print repr(date) > _______________________________________________ > python-chinese > Post: send python-chinese at lists.python.cn > Subscribe: send subscribe to python-chinese-request at lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- GoogleTalk: qcxhome at gmail.com MSN: qcxhome at hotmail.com My Space: tkdchen.spaces.live.com BOINC: boinc.berkeley.edu 中国分布式计算总站: www.equn.com
2006年11月23日 星期四 13:26
实在是头大了,我又尝试了一下,因为是跟vc写的客户端(使用了unicode编码)进行通讯,分析了一下里面的数据,发现在每一个客户端发过来的字符前面加入了'00',而不管我怎么转换,发过去的都是8位的ASCII字符,看看有什么好的解决办法没有?
2006年11月23日 星期四 13:34
On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > 实在是头大了,我又尝试了一下,因为是跟vc写的客户端(使用了unicode编码)进行通讯,分析了一下里面的数据,发现在每一个客户端发过来的字符前面加入了'00',而不管我怎么转换,发过去的都是8位的ASCII字符,看看有什么好的解决办法没有? 那它可能使用的是utf-16-be编码吧。如: >>> a.encode('utf-16-be') '\x00a' -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2006年11月23日 星期四 13:42
你在VC里是不是使用了BSTR类型? On 11/23/06, 隋刚 <blackjacksg at gmail.com> wrote: > 实在是头大了,我又尝试了一下,因为是跟vc写的客户端(使用了unicode编码)进行通讯,分析了一下里面的数据,发现在每一个客户端发过来的字符前面加入了'00',而不管我怎么转换,发过去的都是8位的ASCII字符,看看有什么好的解决办法没有? > _______________________________________________ > python-chinese > Post: send python-chinese at lists.python.cn > Subscribe: send subscribe to python-chinese-request at lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- GoogleTalk: qcxhome at gmail.com MSN: qcxhome at hotmail.com My Space: tkdchen.spaces.live.com BOINC: boinc.berkeley.edu 中国分布式计算总站: www.equn.com
2006年11月23日 星期四 13:57
用的是CString 2006/11/23, 麦田守望者 <qcxhome at gmail.com>: > 你在VC里是不是使用了BSTR类型?
2006年11月23日 星期四 14:07
On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > 用的是CString > unicode是不能直接在网络上传的。所以我想它可能会自动进行转换。最好的方式就是明确传输编码进行转换。不然你要知道它转成什么了。 -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2006年11月23日 星期四 14:11
好的,我再抓包分析一下。谢谢你的帮助。
2006年11月23日 星期四 14:41
>>>db = MySQLdb.connect(host='192.168.0.163',user='apache',passwd='apache',db='apache', charset='utf8') #DB configuration. >>>cursor = db.cursor() >>> sql = "INSERT INTO URL_MD5 (URL,MD5) VALUES (%s, %s)" >>> params = ('天才狐狸','我是谁') >>> cursor.execute(sql,params) 请问这个为什么到MySQL里面是????那! ----- Original Message ----- From: "隋刚" <blackjacksg at gmail.com> To: <python-chinese at lists.python.cn> Sent: Thursday, November 23, 2006 1:57 PM Subject: Re: [python-chinese]socket module 发送unicode信息 > 用的是CString > > 2006/11/23, 麦田守望者 <qcxhome at gmail.com>: >> 你在VC里是不是使用了BSTR类型? > _______________________________________________ > python-chinese > Post: send python-chinese at lists.python.cn > Subscribe: send subscribe to python-chinese-request at lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese
2006年11月23日 星期四 14:54
在windows的网络编程当中,使用的是utf-16来传输,而不是utf-8.
2006年11月23日 星期四 15:09
很多开源软件使用的接口字符集就是UTF-8的,而你向数据库里面输入数据时使用的却不是UTF-8。在Windows下一般是GBK。这个编码是附加在字符串对象上面的,而不是仅仅通过设置软件的字符集就可以支持了。你可以用两种方法,转换为UTF-8或者直接用unicode字符串。 字符串对象(str)上包含的编码信息,Python是不知道的,当然也没有办法帮你解码然后再编码成UTF-8了。 -- 从前有一只很冷的毛毛虫,他想获得一点温暖。而获得温暖的机会只有从树上掉下来,落进别人的领口。 片刻的温暖,之后便失去生命。而很多同类却连这片刻的温暖都没有得到就.. 我会得到温暖么?小心翼翼的尝试,却还是会受到伤害。 我愿为那一刻的温暖去拼,可是谁愿意接受? 欢迎访问偶的博客: http://blog.csdn.net/gashero
2006年11月23日 星期四 15:20
On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > 在windows的网络编程当中,使用的是utf-16来传输,而不是utf-8. 使用什么编码不是一成不变的,有些系统根本不支持unicode,自然也不会使用utf-16来传输。 -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2006年11月24日 星期五 08:39
On 11/23/06, limodou <limodou在gmail.com> wrote: > On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > > 用的是CString > > > unicode是不能直接在网络上传的。所以我想它可能会自动进行转换。最好的方式就是明确传输编码进行转换。不然你要知道它转成什么了。 unicode不能直接在网络上传输?为什么?还有某种字节流不能在网络上传输的? > > -- > I like python! > UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad > My Blog: http://www.donews.net/limodou > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- with kind regards
2006年11月24日 星期五 08:47
On 11/24/06, rosetta <rosettas在gmail.com> wrote: > On 11/23/06, limodou <limodou在gmail.com> wrote: > > On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > > > 用的是CString > > > > > unicode是不能直接在网络上传的。所以我想它可能会自动进行转换。最好的方式就是明确传输编码进行转换。不然你要知道它转成什么了。 > > unicode不能直接在网络上传输?为什么?还有某种字节流不能在网络上传输的? > 就是因为unicode本身不是字节流,它是一个16位或32位的整数,所以无法传输,因此我说了半天一直都说要转换转换,就是这个意思。有些时候你认为可以传,那是因为底层按照某种缺省编码已经自动转过了,如转为utf-8, ansii。比如说对于中文: >>> a = unicode('中国', 'gbk') >>> a u'\u4e2d\u56fd' -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2006年11月24日 星期五 09:14
On 11/24/06, limodou <limodou在gmail.com> wrote: > On 11/24/06, rosetta <rosettas在gmail.com> wrote: > > On 11/23/06, limodou <limodou在gmail.com> wrote: > > > On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > > > > 用的是CString > > > > > > > unicode是不能直接在网络上传的。所以我想它可能会自动进行转换。最好的方式就是明确传输编码进行转换。不然你要知道它转成什么了。 > > > > unicode不能直接在网络上传输?为什么?还有某种字节流不能在网络上传输的? > > > 就是因为unicode本身不是字节流,它是一个16位或32位的整数,所以无法传输, 一个16或32位的整数无法在网络上传输?整数就不是字节流了吗. 普及一下,一个32位的整数占用4个字节,因为一个字节8位. 任何一种编码的字符都可以看成一个整数,只要不超过32位或者说你使用的语言可以识别超过32位的整数. gbk编码的'中',在内存中16进制数值为 D6D0 正如你所说, unicode 16 be 的'中'在内存中16进制数值为 4E2D 你能看出这两个数值有什么明显的差异导致一个能在网络上传输一个不能吗 >因此我说了半天一直都说要转换转换,就是这个意思。有些时候你认为可以传,那是因为底层按照某种缺省编码已经自动转过了,如转为utf-8, > ansii。比如说对于中文: > > >>> a = unicode('中国', 'gbk') > >>> a > u'\u4e2d\u56fd' > > -- > I like python! > UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad > My Blog: http://www.donews.net/limodou > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- with kind regards
2006年11月24日 星期五 09:36
On 11/24/06, rosetta <rosettas在gmail.com> wrote: > On 11/24/06, limodou <limodou在gmail.com> wrote: > > On 11/24/06, rosetta <rosettas在gmail.com> wrote: > > > On 11/23/06, limodou <limodou在gmail.com> wrote: > > > > On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > > > > > 用的是CString > > > > > > > > > unicode是不能直接在网络上传的。所以我想它可能会自动进行转换。最好的方式就是明确传输编码进行转换。不然你要知道它转成什么了。 > > > > > > unicode不能直接在网络上传输?为什么?还有某种字节流不能在网络上传输的? > > > > > 就是因为unicode本身不是字节流,它是一个16位或32位的整数,所以无法传输, > > 一个16或32位的整数无法在网络上传输?整数就不是字节流了吗. > 普及一下,一个32位的整数占用4个字节,因为一个字节8位. > 任何一种编码的字符都可以看成一个整数,只要不超过32位或者说你使用的语言可以识别超过32位的整数. > > gbk编码的'中',在内存中16进制数值为 D6D0 > 正如你所说, unicode 16 be 的'中'在内存中16进制数值为 4E2D > 你能看出这两个数值有什么明显的差异导致一个能在网络上传输一个不能吗 > 整数并不直接是字符,比如a=10, b='b' a + b就出错。因此当向socket.send()时,它要求送入字节流,但你送入整数数组自然报错,数据类型不对,因此要转换。unicode是整数,不是直接的字节流,所以要转啊。python不是C,可以直接把地址内容送出去。python不行。 -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2006年11月24日 星期五 10:28
On 11/24/06, limodou <limodou在gmail.com> wrote: > On 11/24/06, rosetta <rosettas在gmail.com> wrote: > > On 11/24/06, limodou <limodou在gmail.com> wrote: > > > On 11/24/06, rosetta <rosettas在gmail.com> wrote: > > > > On 11/23/06, limodou <limodou在gmail.com> wrote: > > > > > On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > > > > > > 用的是CString > > > > > > > > > > > unicode是不能直接在网络上传的。所以我想它可能会自动进行转换。最好的方式就是明确传输编码进行转换。不然你要知道它转成什么了。 > > > > > > > > unicode不能直接在网络上传输?为什么?还有某种字节流不能在网络上传输的? > > > > > > > 就是因为unicode本身不是字节流,它是一个16位或32位的整数,所以无法传输, > > > > 一个16或32位的整数无法在网络上传输?整数就不是字节流了吗. > > 普及一下,一个32位的整数占用4个字节,因为一个字节8位. > > 任何一种编码的字符都可以看成一个整数,只要不超过32位或者说你使用的语言可以识别超过32位的整数. > > > > gbk编码的'中',在内存中16进制数值为 D6D0 > > 正如你所说, unicode 16 be 的'中'在内存中16进制数值为 4E2D > > 你能看出这两个数值有什么明显的差异导致一个能在网络上传输一个不能吗 > > > 整数并不直接是字符,比如a=10, b='b' 当然不是,我说的是字节,而不是字符. > a + b就出错。因此当向socket.send()时,它要求送入字节流,但你送入整数数组自然报错,数据类型不对,因此要转换。unicode是整数,不是直接的字节流,所以要转啊。python不是C,可以直接把地址内容送出去。python不行。 注意两个表述 1.你说的意思是字符串,而不是字节流,顾名思义字节流就是一个字节一个字节的串,整数显然属于此范围. 2.无论python的某一个函数如何规定,说unicode不能在网络传输显然是错误的. 此外,socket.send是否只接受utf或ansi而不接受unicode 16这个我不确定,但我觉得应该是可以接受的. 设想一下,如果unicode 16必须被转化为ansi, 那我想传输一个'中'给某个ip的时候就必须将4E2D转换为D6D0在tcp协议中传输,这显然是荒谬的.如果对方监听软件已经写好了等待的就是unicode 16编码,也就是说,对方就像从tcp数据包中得到4E2D,难道python就不能用了吗? > > -- > I like python! > UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad > My Blog: http://www.donews.net/limodou > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- with kind regards
2006年11月24日 星期五 10:45
On 11/24/06, rosetta <rosettas在gmail.com> wrote: > On 11/24/06, limodou <limodou在gmail.com> wrote: > > On 11/24/06, rosetta <rosettas在gmail.com> wrote: > > > On 11/24/06, limodou <limodou在gmail.com> wrote: > > > > On 11/24/06, rosetta <rosettas在gmail.com> wrote: > > > > > On 11/23/06, limodou <limodou在gmail.com> wrote: > > > > > > On 11/23/06, 隋刚 <blackjacksg在gmail.com> wrote: > > > > > > > 用的是CString > > > > > > > > > > > > > unicode是不能直接在网络上传的。所以我想它可能会自动进行转换。最好的方式就是明确传输编码进行转换。不然你要知道它转成什么了。 > > > > > > > > > > unicode不能直接在网络上传输?为什么?还有某种字节流不能在网络上传输的? > > > > > > > > > 就是因为unicode本身不是字节流,它是一个16位或32位的整数,所以无法传输, > > > > > > 一个16或32位的整数无法在网络上传输?整数就不是字节流了吗. > > > 普及一下,一个32位的整数占用4个字节,因为一个字节8位. > > > 任何一种编码的字符都可以看成一个整数,只要不超过32位或者说你使用的语言可以识别超过32位的整数. > > > > > > gbk编码的'中',在内存中16进制数值为 D6D0 > > > 正如你所说, unicode 16 be 的'中'在内存中16进制数值为 4E2D > > > 你能看出这两个数值有什么明显的差异导致一个能在网络上传输一个不能吗 > > > > > 整数并不直接是字符,比如a=10, b='b' > 当然不是,我说的是字节,而不是字符. > > > a + b就出错。因此当向socket.send()时,它要求送入字节流,但你送入整数数组自然报错,数据类型不对,因此要转换。unicode是整数,不是直接的字节流,所以要转啊。python不是C,可以直接把地址内容送出去。python不行。 > > 注意两个表述 > 1.你说的意思是字符串,而不是字节流,顾名思义字节流就是一个字节一个字节的串,整数显然属于此范围. 注意这里说的是python,字节流就是字符串,我看不出有什么不同来。而在python中字符串与整数是不同的。你不能直接把整数写入一个文件或socket,要么使用struct要么使用其它的方式来转换。所以我所有的说明都是基于在python环境下进行的。 请问你可以实现: file('a.txt', 'w').write(1000) 不报错吗? > 2.无论python的某一个函数如何规定,说unicode不能在网络传输显然是错误的. 看来你还是不明白unicode与unicode编码之间的关系。这样看吧: >>> a = unicode('中国', 'gbk') >>> a u'\u4e2d\u56fd' >>> a.encode('utf-8') '\xe4\xb8\xad\xe5\x9b\xbd' >>> a.encode('utf-16') '\xff\xfe-N\xfdV' >>> a.encode('utf-16-be') 'N-V\xfd' >>> a.encode('utf-16-le') '-N\xfdV' 可以看出unicode本身与使用相应的unicode编码转换后的结果是不同的。而转换后的结果是字符串,是可以传递的。ansi只是一种字符串的编码,并不一定unicode可以成功转换。我的意思就是把非字符流的数据转为字符数,因此要转换。 看来你不明白我的意思,再理解一下吧。 -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2006年11月24日 星期五 10:46
我想这里有几个概念要澄清~ 这样才能有比较好的交流的基础,而不是说同一个名 字,却各自指的不是同一个东西。我也只是班门弄斧,希望大家指正。 unicode是一个字符集,不是一种编码,她只是定义了一个字符空间,把字符集中的字 符映射到了相应的整数上,并为每一个字符提供了唯一的名字,比如,'中' U+4E2D。 但unicode并没有定义编码方式(codec),也就是从字符集到字节序列的映射方式。有 专门为unicode定义的编码方式,比如utf-8,utf-16(be/le),他们定义了unicode字符 到字节序列的映射,也就是编码。utf-16简单的用16bit两个字节来编码 (encode)unicode,utf-8用1倒3个或者更多的字节编码(encode)一个unicode字符。这 些codec同时也定义了如何从一个字节序列中decode出unicode字符序列的方式。 所以,unicode是一个抽象的字符概念,并不是一个字节流,她到字节流的映射靠 codec来完成。python中,用unicode对象来表示抽象的unicode字符,我觉得到这个程 度就可以了,不必关心其中是不是靠整数来表示的。关键是string对象就是字节 流,python的unicode对象不同于string对象,抽象的unicode对象到字节流的 string对象之间需要靠codec来转换。(在py3k中可能要统一unicode和string对象,再 议) 而gbk也是一个字符集,但同时他也定义了gbk这种codec(一种mbcs的codec),它定义 了一个gbk字符(英文或者中文)到字节序列(一个或者两个字节)的映射。因为 unicode的集合比gbk大,使gbk的超集,所以,可以把gbk编码的字节流转换成 unicode字符序列,也可以把一部分的unicode字符(gbk子集的部分)编码为gbk的字节 序列。所以,gbk也可以作为unicode的一种codec来用。 比如:(我现在在windows下面,所以默认的编码就是gbk的) >>> sgbkzhong = '中' #输入默认gbk编码的string对象 >>> sgbkzhong #这是个以gbk编码的两个字节的字节流 '\xd6\xd0' >>> len(sgbkzhong) #所以她的长度是2 2 >>> uzhong=unicode(sgbkzhong,'gbk') #可以将这个字符序列decode成unicode对象 >>> uzhong #这个unicode是U+4E2D u'\u4e2d' >>> len(uzhong) #这个unicode字符序列的长度是1 1 >>> sutf8zhong=uzhong.encode('utf-8') >>> sutf8zhong '\xe4\xb8\xad' >>> len(sutf8zhong) #编码成utf-8的字节流,长度是3 3 >>> sutf16bezhong=uzhong.encode('utf-16be') >>> sutf16bezhong 'N-' >>> len(sutf16bezhong) #编码成utf-16be的字节流,长度是2 2 >>> sutf16bezhong.encode('hex') #我们看一下'N-'对应的hex '4e2d' >>> 以上说明的是python中unicode和string(字节流)之间的关系。 而socket接口只能传输字节流,她并不关心你的内容是什么,自然也不能传什么抽象 的unicode对象,她只能传输将unicode编码过的字节流。所以,python的socket接口 只能处理string对象,如果不是string对象,会被首先转换成string对象。 具体到你这个问题, On Thu, 23 Nov 2006 13:34:45 +0800, limodou <limodou at gmail.com> wrote: > On 11/23/06, 隋刚 <blackjacksg at gmail.com> wrote: >> 实在是头大了,我又尝试了一下,因为是跟vc写的客户端(使用了unicode编码)进 >> 行通讯,分析了一下里面的数据,发现在每一个客户端发过来的字符前面加入了 >> '00',而不管我怎么转换,发过去的都是8位的ASCII字符,看看有什么好的解决办 >> 法没有? > 那它可能使用的是utf-16-be编码吧。如: > >>> a.encode('utf-16-be') > '\x00a' 我想limodou已经替你解决了,我的理解和他一样,你的vc的客户端使用的应该是 utf-16be的编码,不知道你使用这种方法后的结果怎么样了。 至于你之前的代码,为什么直接send unicode对象,对方却接收到的是ascii字符串, 原因是send()函数会把你的unicode对象用转换成str()转换成string对象,使用的 codec是你指定的'utf-8',因为都是英文字符,所以,utf-8编码的结果是和ascii一 致的。 On Mon, 20 Nov 2006 17:58:49 +0800, 隋刚 <blackjacksg at gmail.com> wrote: > 请问使用python的socket module发送unicode的信息怎么发送,我试着转换了一 > 下,发送到服务器端还是ascii的,可以看看我的源程序,谢谢。 > import socket > import sys > reload(sys) > sys.setdefaultencoding('utf-8') > host = "192.168.3.111" > port = 8888 > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) > s.connect((host, port)); > str = u'' > s.send(str) > date = s.recvfrom(4096) > s.close() > print repr(date) On Fri, 24 Nov 2006 09:14:26 +0800, rosetta <rosettas at gmail.com> wrote: > On 11/24/06, limodou <limodou at gmail.com> wrote: >> On 11/24/06, rosetta <rosettas at gmail.com> wrote: >> > On 11/23/06, limodou <limodou at gmail.com> wrote: >> > > On 11/23/06, 隋刚 <blackjacksg at gmail.com> wrote: >> > > > 用的是CString >> > > > >> > > unicode是不能直接在网络上传的。所以我想它可能会自动进行转换。最好的 >> 方式就是明确传输编码进行转换。不然你要知道它转成什么了。 >> > >> > unicode不能直接在网络上传输?为什么?还有某种字节流不能在网络上传输的? >> > >> 就是因为unicode本身不是字节流,它是一个16位或32位的整数,所以无法传输, > > 一个16或32位的整数无法在网络上传输?整数就不是字节流了吗. > 普及一下,一个32位的整数占用4个字节,因为一个字节8位. > 任何一种编码的字符都可以看成一个整数,只要不超过32位或者说你使用的语言可以 > 识别超过32位的整数. > > gbk编码的'中',在内存中16进制数值为 D6D0 > 正如你所说, unicode 16 be 的'中'在内存中16进制数值为 4E2D > 你能看出这两个数值有什么明显的差异导致一个能在网络上传输一个不能吗 > >> 因此我说了半天一直都说要转换转换,就是这个意思。有些时候你认为可以传,那 >> 是因为底层按照某种缺省编码已经自动转过了,如转为utf-8, >> ansii。比如说对于中文: > > >> >> >>> a = unicode('中国', 'gbk') >> >>> a >> u'\u4e2d\u56fd' >> >> -- >> I like python! >> UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad >> My Blog: http://www.donews.net/limodou >> _______________________________________________ >> python-chinese >> Post: send python-chinese at lists.python.cn >> Subscribe: send subscribe to python-chinese-request at lists.python.cn >> Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn >> Detail Info: http://python.cn/mailman/listinfo/python-chinese > > -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Zeuux © 2025
京ICP备05028076号