2006年11月24日 星期五 11:05
顺便推荐一下这篇FAQ,对Unicode讲解得很通透,让我明白了很多原先很混乱的概 念。 UTF-8 and Unicode FAQ for Unix/Linux http://www.cl.cam.ac.uk/~mgk25/unicode.html 这儿有一个捎老一点的中文版 http://www.linuxforum.net/books/UTF-8-Unicode.html On Fri, 24 Nov 2006 10:46:05 +0800, Leira Hua <lhua at altigen.com.cn> wrote: > 我想这里有几个概念要澄清~ 这样才能有比较好的交流的基础,而不是说同一个名 > 字,却各自指的不是同一个东西。我也只是班门弄斧,希望大家指正。 > > 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' >>>> > -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
2006年11月24日 星期五 11:11
On 11/24/06, Leira Hua <lhua在altigen.com.cn> wrote: > 我想这里有几个概念要澄清~ 这样才能有比较好的交流的基础,而不是说同一个名 > 字,却各自指的不是同一个东西。我也只是班门弄斧,希望大家指正。 > > 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在gmail.com> wrote: > > > On 11/23/06, 隋刚 <blackjacksg在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一 > 致的。 > 比我说得清楚。不错! -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2006年11月24日 星期五 11:48
在 06-11-24,Leira Hua<lhua at altigen.com.cn> 写道: > 顺便推荐一下这篇FAQ,对Unicode讲解得很通透,让我明白了很多原先很混乱的概 > 念。 > UTF-8 and Unicode FAQ for > Unix/Linux http://www.cl.cam.ac.uk/~mgk25/unicode.html > 这儿有一个捎老一点的中文版 > http://www.linuxforum.net/books/UTF-8-Unicode.html > > On Fri, 24 Nov 2006 10:46:05 +0800, Leira Hua > <lhua at altigen.com.cn> wrote: > > > 我想这里有几个概念要澄清~ 这样才能有比较好的交流的基础,而不是说同一个名 > > 字,却各自指的不是同一个东西。我也只是班门弄斧,希望大家指正。 > > > > 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' > >>>> 呵呵,谢谢两位的争论,问题我已经解决了,我转换的时候直接转换成为了utf-16的形式,但是又出现了一个问题,就是python在把字符串转换成为了utf-16的时候会在串前面加入两个字节,当我把这两个字节截取掉之后,就跟vc的数据传输一模一样了。
2006年11月24日 星期五 11:49
其实前面已经说得很清楚了,用utf-16be的 codec。be(BigEndian)/le(LittleEndian),如果只是用utf-16的话,python会在前面 加上BOM(Byte-Order Mark,U+FEFF)用于表示后面的字节序,而且,好像是依赖具体 平台的。 On Fri, 24 Nov 2006 11:48:12 +0800, 隋刚 <blackjacksg at gmail.com> wrote: > 呵呵,谢谢两位的争论,问题我已经解决了,我转换的时候直接转换成为了 > utf-16的形式,但是又出现了一个问题,就是python在把字符串转换成为了 > utf-16的时候会在串前面加入两个字节,当我把这两个字节截取掉之后,就跟vc的 > 数据传输一模一样了。 -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
2006年11月24日 星期五 11:59
赞,我不用回了 On 11/24/06, Leira Hua <lhua在altigen.com.cn> wrote: > 我想这里有几个概念要澄清~ 这样才能有比较好的交流的基础,而不是说同一个名 > 字,却各自指的不是同一个东西。我也只是班门弄斧,希望大家指正。 > > 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在gmail.com> wrote: > > > On 11/23/06, 隋刚 <blackjacksg在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在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在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 > > 你能看出这两个数值有什么明显的差异导致一个能在网络上传输一个不能吗 > > > >> 因此我说了半天一直都说要转换转换,就是这个意思。有些时候你认为可以传,那 > >> 是因为底层按照某种缺省编码已经自动转过了,如转为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 > > > > > > > > -- > Using Opera's revolutionary e-mail client: http://www.opera.com/mail/ > > _______________________________________________ > 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日 星期五 11:59
On 11/24/06, Ëå¸Õ <blackjacksg在gmail.com> wrote: > > > ºÇºÇ£¬Ð»Ð»Á½Î»µÄÕùÂÛ£¬ÎÊÌâÎÒÒѾ½â¾öÁË£¬ÎÒת»»µÄʱºòÖ±½Óת»»³ÉΪÁËutf-16µÄÐÎʽ£¬µ«ÊÇÓÖ³öÏÖÁËÒ»¸öÎÊÌ⣬¾ÍÊÇpythonÔÚ°Ñ×Ö·û´®×ª»»³ÉΪÁËutf-16µÄʱºò»áÔÚ´®Ç°Ãæ¼ÓÈëÁ½¸ö×Ö½Ú£¬µ±ÎÒ°ÑÕâÁ½¸ö×Ö½Ú½ØÈ¡µôÖ®ºó£¬¾Í¸úvcµÄÊý¾Ý´«ÊäһģһÑùÁË¡£ > Ç°ÃæµÄÄÇÁ½¸ö×Ö½ÚÊÇ BOM, ָʾ×Ö½Ú˳ÐòºÍ±àÂëµÄ, ²»ÊDZØÐëµÄ, µ«ÊÇͨ³£ÔÚÍøÂç´«ÊäµÄʱºò»á¼ÓÉÏ, ÒòΪÍøÉϵIJ»Í¬»úÆ÷µÄ×Ö½Ú˳Ðò¿ÉÄÜÊDz»Í¬µÄ(һЩÊÇbig-endian, һЩÊÇ little-endian, IntelµÄ»úÆ÷¶¼ÊÇLittle-EndianµÄ, ÓÃPowerPCоƬµÄºÃÏñÊÇ Big-Endian) http://unicode.org/unicode/faq/utf_bom.html#BOM -- simple is good http://brucewang.net skype: number5 -------------- 下一部分 -------------- Ò»¸öHTML¸½¼þ±»ÒƳý... URL: http://python.cn/pipermail/python-chinese/attachments/20061124/02fa14f1/attachment.htm
2006年11月25日 星期六 00:36
如果你用的是mysql4.1以上版本, 在执行查询前运行'set names gbk'语句. 2006/11/23, gashero <harry.python at gmail.com>: > > > 很多开源软件使用的接口字符集就是UTF-8的,而你向数据库里面输入数据时使用的却不是UTF-8。在Windows下一般是GBK。这个编码是附加在字符串对象上面的,而不是仅仅通过设置软件的字符集就可以支持了。你可以用两种方法,转换为UTF-8或者直接用unicode字符串。 > > 字符串对象(str)上包含的编码信息,Python是不知道的,当然也没有办法帮你解码然后再编码成UTF-8了。 > > -- > 从前有一只很冷的毛毛虫,他想获得一点温暖。而获得温暖的机会只有从树上掉下来,落进别人的领口。 > 片刻的温暖,之后便失去生命。而很多同类却连这片刻的温暖都没有得到就.. > 我会得到温暖么?小心翼翼的尝试,却还是会受到伤害。 > 我愿为那一刻的温暖去拼,可是谁愿意接受? > > 欢迎访问偶的博客: > http://blog.csdn.net/gashero > _______________________________________________ > 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 -- ------------------------ zarz ------------------------ -------------- next part -------------- An HTML attachment was scrubbed... URL: http://python.cn/pipermail/python-chinese/attachments/20061125/53d4e334/attachment.html
Zeuux © 2025
京ICP备05028076号