为什么Python内部实现要使用UCS2编码?

327 views
Skip to first unread message

Liang Sun

unread,
Mar 5, 2012, 9:43:22 PM3/5/12
to pyth...@googlegroups.com
如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
有人能解释下,为什么要用UCS2吗?

pansz

unread,
Mar 5, 2012, 9:58:38 PM3/5/12
to pyth...@googlegroups.com
2012/3/6 Liang Sun <i...@liangsun.org>:

> 如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
> 另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
> 有人能解释下,为什么要用UCS2吗?

utf-8 是用来传输的编码, ucs2 是用来表示的编码,utf-8 的变长特性对于程序处理来说是低效的。

python2 最大的问题不在于采用什么编码,而在于它的缺省编码解码器是 ascii,而且又混用 unicode 跟 str
类型。因此,一旦涉及到 unicode/str 之间的自动转换,非 ascii 字符集就铁定出问题。

python3 在解决这个问题上没有做多少努力,仅仅是把缺省编码解码器改成了 utf-8,因而在任何 unicode/str 之间转换时,缺省使用 utf-8。

要想在 python2 中实现缺省 utf-8 也很简单的:
reload(sys)
sys.setdefaultencoding('utf-8')
即可。

当然,在某些情况下,这样做可能造成问题,不过,貌似它造成的问题相比它带来的方便而言,实在是微不足道。

Liang Sun

unread,
Mar 5, 2012, 10:09:08 PM3/5/12
to pyth...@googlegroups.com
多谢poet指点。
还有一点不明白,Wikipedia上说,UCS2早在1996年就被UTF-16替代了,Python为什么不用新的标准呢?
还有就是(有点跑题),UCS2能表示所有字符吗?


在 2012年3月6日星期二UTC+8上午10时58分38秒,poet写道:

Zoom.Quiet

unread,
Mar 5, 2012, 10:14:27 PM3/5/12
to pyth...@googlegroups.com
在 2012年3月6日 上午11:09,Liang Sun <i...@liangsun.org> 写道:
> 多谢poet指点。
> 还有一点不明白,Wikipedia上说,UCS2早在1996年就被UTF-16替代了,Python为什么不用新的标准呢?

- py 实现时,还没有 utf-16 哈,,,

> --
> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 发言: pyth...@googlegroups.com
> 退订: python-cn+...@googlegroups.com (向此发空信即退!)
> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> 强烈: 建议使用技巧: 如何有效地报告Bug
> http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

--
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
俺: http://about.me/zoom.quiet
文字协议: http://creativecommons.org/licenses/by-sa/2.5/cn/

Liang Sun

unread,
Mar 5, 2012, 10:47:59 PM3/5/12
to pyth...@googlegroups.com
原来如此。。。
刚才查了一下,UCS2确实不能表示所有的字符,比如太玄经的字符就不能表示,呵呵
我知道无论UTF-8,UTF-32,还是UTF-16都是变长的。。。
然而无论如何,(个人观点)py2由于历史原因用了UCS2,py3是时候放弃UCS2了,就单凭不能表示所有字符这一点,至于用哪个其他的,需要仔细考虑下,不知道你们怎么看的?

在 2012年3月6日星期二UTC+8上午11时14分27秒,Zoom Quiet写道:
在 2012年3月6日 上午11:09,Liang Sun <i...@liangsun.org> 写道:
> 多谢poet指点。
> 还有一点不明白,Wikipedia上说,UCS2早在1996年就被UTF-16替代了,Python为什么不用新的标准呢?

- py 实现时,还没有 utf-16 哈,,,

> 还有就是(有点跑题),UCS2能表示所有字符吗?
>
>
> 在 2012年3月6日星期二UTC+8上午10时58分38秒,poet写道:
>>
>> 2012/3/6 Liang Sun <i...@liangsun.org>:
>> > 如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
>> >
>> > 另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
>> > 有人能解释下,为什么要用UCS2吗?
>>
>> utf-8 是用来传输的编码, ucs2 是用来表示的编码,utf-8 的变长特性对于程序处理来说是低效的。
>>
>> python2 最大的问题不在于采用什么编码,而在于它的缺省编码解码器是 ascii,而且又混用 unicode 跟 str
>> 类型。因此,一旦涉及到 unicode/str 之间的自动转换,非 ascii 字符集就铁定出问题。
>>
>> python3 在解决这个问题上没有做多少努力,仅仅是把缺省编码解码器改成了 utf-8,因而在任何 unicode/str 之间转换时,缺省使用
>> utf-8。
>>
>> 要想在 python2 中实现缺省 utf-8 也很简单的:
>> reload(sys)
>> sys.setdefaultencoding('utf-8')
>> 即可。
>>
>> 当然,在某些情况下,这样做可能造成问题,不过,貌似它造成的问题相比它带来的方便而言,实在是微不足道。
>
> --
> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 发言: pyth...@googlegroups.com

> 退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)


> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> 强烈: 建议使用技巧: 如何有效地报告Bug
> http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

Qiangning Hong

unread,
Mar 5, 2012, 10:52:35 PM3/5/12
to pyth...@googlegroups.com
2012/3/6 Liang Sun <i...@liangsun.org>

原来如此。。。
刚才查了一下,UCS2确实不能表示所有的字符,比如太玄经的字符就不能表示,呵呵
我知道无论UTF-8,UTF-32,还是UTF-16都是变长的。。。
然而无论如何,(个人观点)py2由于历史原因用了UCS2,py3是时候放弃UCS2了,就单凭不能表示所有字符这一点,至于用哪个其他的,需要仔细考虑下,不知道你们怎么看的?

编译Python时用 --enable-unicode=ucs4



--
洪强宁 Qiangning Hong
http://www.douban.com/people/hongqn/
twitter: @hongqn

Shell Xu

unread,
Mar 5, 2012, 10:53:47 PM3/5/12
to pyth...@googlegroups.com
python使用的是UCS4。


--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)

详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html



--
无能者无所求,饱食而遨游,泛若不系之舟
blog: http://shell909090.com/blog/
twitter: http://twitter.com/shell909090

Liang Sun

unread,
Mar 5, 2012, 11:06:23 PM3/5/12
to pyth...@googlegroups.com
多谢多谢,呵呵

在 2012年3月6日星期二UTC+8上午11时52分35秒,Qiangning Hong写道:

Leo Jay

unread,
Mar 6, 2012, 12:20:10 AM3/6/12
to pyth...@googlegroups.com
2012/3/6 Liang Sun <i...@liangsun.org>:

> 如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
> 另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
> 有人能解释下,为什么要用UCS2吗?
>

python可以使用ucs2或ucs4,且在大部分linux里,使用的是ucs4
http://docs.python.org/c-api/unicode.html#Py_UNICODE

utf8这种变长的编码,只有在序列化的时候用起来比较方便,在内存里表示和处理的时候还是定长来得方便
不然怎么来实现string slice呢?

--
Best Regards,
Leo Jay

pansz

unread,
Mar 6, 2012, 12:26:02 AM3/6/12
to pyth...@googlegroups.com
2012/3/6 Liang Sun <i...@liangsun.org>:

> 多谢poet指点。
> 还有一点不明白,Wikipedia上说,UCS2早在1996年就被UTF-16替代了,Python为什么不用新的标准呢?
> 还有就是(有点跑题),UCS2能表示所有字符吗?

目前绝大多数 linux 发行版中,python 用的都是 ucs4 。

Liang Sun

unread,
Mar 6, 2012, 1:42:31 AM3/6/12
to pyth...@googlegroups.com
多谢各位的回复,我获益匪浅。

在 2012年3月6日星期二UTC+8下午1时20分10秒,Leo Jay写道:

ubunoon

unread,
Mar 6, 2012, 2:14:55 AM3/6/12
to pyth...@googlegroups.com
utf-8考虑的是存储,尤其是ascii码的存储,与原先的是一样的,在网络传输的时候也可以少一些字节流(老外更多考虑的是ascii码)

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html



--
DamonChen
My blog: http://www.cnblogs.com/ubunoon/
珍珠饰品:http://zjyuezz.cn.alibaba.com/


Breaker Zhao

unread,
Mar 6, 2012, 9:47:00 AM3/6/12
to pyth...@googlegroups.com
UTF-16 和 UCS2 可认为在 BMP 区是相同的,但 UTF-16 > UCS2
UTF-8 是为兼容 ANSI 系统,它们的 ASCII 子集相同
UCS 的好处是可以随机定位,通常用在内码上,容易计算 strlen 这种东西
UTF-8 是变长编码,需要按流解析,随机定位可能切断字符
但有一种说法是 Win 的内码是 UTF-16,也不知为啥

netubu

unread,
Mar 6, 2012, 10:06:31 AM3/6/12
to python-cn
win32是 UTF-16,和wchar_t类型一样,定长类型,占用2个字节,编写程序就简单多了,utf-8变长,写程序就费劲多了。
 

Damon
2012-03-06
 
发件人: Breaker Zhao
发送时间: 2012-03-06 22:47
收件人: python-cn
主题: Re: [CPyUG] 为什么Python内部实现要使用UCS2编码?

Liang Sun

unread,
Mar 6, 2012, 10:13:22 AM3/6/12
to pyth...@googlegroups.com
至于Windows,在XP之前是用的UCS2,在XP之后用的是UTF-16,然而虽然系统是基于UTF-16的,提供给程序员的接口API却只有UCS2的,这就造成了很多人的误解。


2012/3/6 netubu <net...@gmail.com>



--
Liang Sun <http://liangsun.org>

CHEN Xing

unread,
Mar 6, 2012, 1:56:25 PM3/6/12
to pyth...@googlegroups.com
2012/3/6 netubu <net...@gmail.com>:

> win32是 UTF-16,和wchar_t类型一样,定长类型,占用2个字节,编写程序就简单多了,utf-8变长,写程序就费劲多了。

UTF-16不是定长编码,UCS-2是,但UCS2的字不全。UCS4算是定长又能表示足够多的字了,但这样一来文本占的内存就大了很多,好奇Windows是具体如何用UTF-16处理这个矛盾的。

CHEN, Xing / 陈醒

1+1=2

unread,
Mar 6, 2012, 5:33:39 PM3/6/12
to pyth...@googlegroups.com
或许MSDN这段话能说明问题

http://msdn.microsoft.com/en-us/library/ms904394.aspx

Windows CE provides Unicode surrogate support at the OS level and in
Microsoft(R) Internet Explorer. The support is limited to surrogate
handling and display; editing is not supported.

Debao


2012/3/6 CHEN Xing <cxcx...@gmail.com>:

pansz

unread,
Mar 6, 2012, 7:32:36 PM3/6/12
to pyth...@googlegroups.com
2012/3/7 CHEN Xing <cxcx...@gmail.com>:

> UTF-16不是定长编码,UCS-2是,但UCS2的字不全。UCS4算是定长又能表示足够多的字了,但这样一来文本占的内存就大了很多,好奇Windows是具体如何用UTF-16处理这个矛盾的。

utf-16 虽然不是定长,但大多数情况下他是两个字节,极少数的字用四个字节表示。没有其他的可能。甚至对于不仔细的程序员而言,把它当做
ucs2 也没有太大问题(因为那些四字节编码就算你遇到了不处理,也不可能造成字节错位等“错误传染”问题)。

utf-8 不是定长,他可以是一字节,两字节,三字节,四字节,处理起来相对还是要复杂些的。

Liang Sun

unread,
Mar 6, 2012, 9:55:46 PM3/6/12
to pyth...@googlegroups.com
确实是这样。对于仔细的程序员也没有办法,因为Windows根本没有提供UTF16的API,所以必须按照UCS2来处理。

在 2012年3月7日星期三UTC+8上午8时32分36秒,poet写道:

Liang Sun

unread,
Mar 6, 2012, 10:01:08 PM3/6/12
to pyth...@googlegroups.com
多谢纠正。UTF-32(UCS4)是定长的。

在 2012年3月7日星期三UTC+8上午2时56分25秒,cx写道:

>>> 退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)


>>> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> 强烈: 建议使用技巧: 如何有效地报告Bug
>>> http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
>>
>>
>>
>>
>> --
>> DamonChen
>> My blog: http://www.cnblogs.com/ubunoon/
>> 珍珠饰品:http://zjyuezz.cn.alibaba.com/
>>
>>
>> --
>> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
>> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
>> 发言: pyth...@googlegroups.com

>> 退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)


>> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>> 强烈: 建议使用技巧: 如何有效地报告Bug
>> http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
>
>
> --
> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 发言: pyth...@googlegroups.com

> 退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)


> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> 强烈: 建议使用技巧: 如何有效地报告Bug
> http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
>
> --
> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 发言: pyth...@googlegroups.com

> 退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)

Lucian

unread,
Mar 7, 2012, 2:23:35 AM3/7/12
to pyth...@googlegroups.com
UCS是 Unicode Character Set, UTF是 UCS Transformation Format ,编码和传输格式是两码事。
python内部的unicode对象是对unicode编码的处理,和utf8没有关系。
不管是utf8,还是utf16,编码都是相同的,只是传输格式不同。

Liang Sun

unread,
Mar 7, 2012, 2:35:58 AM3/7/12
to pyth...@googlegroups.com
呵呵,这么严格的区分倒是第一次听说。
维基百科上说UTF32和UCS4除了语义上的一点区别,实际上是完全相同的。而UTF16也包含了UCS2的绝大部分,可以说UCS2是UTF-16的子集。
您说“utf8和utf16的编码相同”,其中的“编码”指的是什么?

2012/3/7 Lucian <luxin...@gmail.com>

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)

详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html



--
Liang Sun <http://liangsun.org>

Lucian

unread,
Mar 7, 2012, 2:59:33 AM3/7/12
to pyth...@googlegroups.com
维基百科对于普通人来讲还是很权威的,但是对于专业人士未必非常准确,所以对维基不必尽信。
UCS规定了怎么用多个字节表示字符,UCS有两种格式: UCS-2和UCS-4。顾名思义,UCS-2用两个字节编码,UCS-4用四个字节编码(实际上只用了31位,首位必须为0)。
UCS-4分为128个group,每个group分为256个plane,每个plane分为256个row,每个row分为256个cell。其中group0的plane0即我们熟知的BMP。
BMP前两个字节都为0,去掉两个零字节就是UCS-2。
常见的UTF有utf-8,utf-16。utf-8以字节为单位对UCS进行编码,utf-16以两个字节为单位对UCS编码。双字节编码还存在字节序的问题,utf-8是单字节编码没有字节符。
所以我说UCS和UTF是两码事

On Wednesday, March 7, 2012 3:35:58 PM UTC+8, Liang Sun wrote:
呵呵,这么严格的区分倒是第一次听说。
维基百科上说UTF32和UCS4除了语义上的一点区别,实际上是完全相同的。而UTF16也包含了UCS2的绝大部分,可以说UCS2是UTF-16的子集。
您说“utf8和utf16的编码相同”,其中的“编码”指的是什么?

2012/3/7 Lucian <luxin...@gmail.com>
UCS是 Unicode Character Set, UTF是 UCS Transformation Format ,编码和转换格式是两码事。
python内部的unicode对象是对unicode编码的处理,和utf8没有关系。
不管是utf8,还是utf16,编码都是相同的,只是传输格式不同。


On Tuesday, March 6, 2012 10:43:22 AM UTC+8, Liang Sun wrote:
如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
有人能解释下,为什么要用UCS2吗?

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)

详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html



--
Liang Sun <http://liangsun.org>


On Wednesday, March 7, 2012 3:35:58 PM UTC+8, Liang Sun wrote:
呵呵,这么严格的区分倒是第一次听说。
维基百科上说UTF32和UCS4除了语义上的一点区别,实际上是完全相同的。而UTF16也包含了UCS2的绝大部分,可以说UCS2是UTF-16的子集。
您说“utf8和utf16的编码相同”,其中的“编码”指的是什么?

2012/3/7 Lucian <luxin...@gmail.com>
UCS是 Unicode Character Set, UTF是 UCS Transformation Format ,编码和传输格式是两码事。
python内部的unicode对象是对unicode编码的处理,和utf8没有关系。
不管是utf8,还是utf16,编码都是相同的,只是传输格式不同。


On Tuesday, March 6, 2012 10:43:22 AM UTC+8, Liang Sun wrote:
如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
有人能解释下,为什么要用UCS2吗?

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)

详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

CHEN Xing

unread,
Mar 7, 2012, 3:39:47 AM3/7/12
to pyth...@googlegroups.com
2012/3/6 Lucian <luxin...@gmail.com>

>
> 维基百科对于普通人来讲还是很权威的,但是对于专业人士未必非常准确,所以对维基不必尽信。
> UCS规定了怎么用多个字节表示字符,UCS有两种格式: UCS-2和UCS-4。顾名思义,UCS-2用两个字节编码,UCS-4用四个字节编码(实际上只用了31位,首位必须为0)。
> UCS-4分为128个group,每个group分为256个plane,每个plane分为256个row,每个row分为256个cell。其中group0的plane0即我们熟知的BMP。
> BMP前两个字节都为0,去掉两个零字节就是UCS-2。
> 常见的UTF有utf-8,utf-16。utf-8以字节为单位对UCS进行编码,utf-16以两个字节为单位对UCS编码。双字节编码还存在字节序的问题,utf-8是单字节编码没有字节符。

如此咬文嚼字其实意思不大,但Wikipedia上的说法一般是有道理的,怀疑它还需相当谨慎。

顾名思义,UCS是个字符集,但UCS-2和UCS-4都是与该字符集相关的编码方式。UTF-8、UTF-16、UTF-32同样是编码方式。

所以:

2012/3/6 Lucian <luxin...@gmail.com>


>
> UCS是 Unicode Character Set, UTF是 UCS Transformation Format ,编码和传输格式是两码事。
> python内部的unicode对象是对unicode编码的处理,和utf8没有关系。

同意。

> 不管是utf8,还是utf16,编码都是相同的,只是传输格式不同。

他们确实都是UCS中字符的表示方式,但是是不同的。一般所讲的encoding,是要注重真正“编码”到字节流的,所以UTF-8和UTF-16是两种不同的编码。在Python中,encoding也是这个意思。

当然,如果说“编码”是一个字到一个整数(code
point)的映射,那么UTF-8和UTF-16都是在这个映射的基础上将字符转为字节流的。但我个人未见以这种方式阐释“编码”的。

> 所以我说UCS和UTF是两码事
是的。但不影响UCS-2、UCS-4跟UTF-8、UTF-16啥的是一类东西。UTF-8是一种UTF,但UCS-2不是“一种UCS”,而跟UTF-8一样,是UCS的一种表示方式。


我觉得,楼主这个问题的答案,如楼上诸位所说,不用UTF-8之类编码原因估计主要是(不)定长编码的问题。之于UCS-4,可能主要是基于占用内存的考虑吧。以前Archlinux的Python就是基于UCS-2的,处理古文时就废了。。。但是近年来经过大家的complain,多数Linux发行版已经用UCS-4编译Python了,这个问题应该已基本不存在。

CHEN, Xing / 陈醒

>
> On Wednesday, March 7, 2012 3:35:58 PM UTC+8, Liang Sun wrote:
>>
>> 呵呵,这么严格的区分倒是第一次听说。
>> 维基百科上说UTF32和UCS4除了语义上的一点区别,实际上是完全相同的。而UTF16也包含了UCS2的绝大部分,可以说UCS2是UTF-16的子集。
>> 您说“utf8和utf16的编码相同”,其中的“编码”指的是什么?
>>
>> 2012/3/7 Lucian <luxin...@gmail.com>
>>>
>>> UCS是 Unicode Character Set, UTF是 UCS Transformation Format ,编码和转换格式是两码事。
>>> python内部的unicode对象是对unicode编码的处理,和utf8没有关系。
>>> 不管是utf8,还是utf16,编码都是相同的,只是传输格式不同。
>>>
>>>
>>> On Tuesday, March 6, 2012 10:43:22 AM UTC+8, Liang Sun wrote:
>>>>
>>>> 如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
>>>> 另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
>>>> 有人能解释下,为什么要用UCS2吗?
>>>
>>> --
>>> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
>>> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 发言: pyth...@googlegroups.com

>>> 退订: python-cn+...@googlegroups.com (向此发空信即退!)


>>> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> 强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
>>
>>
>>
>>
>> --
>> Liang Sun <http://liangsun.org>
>>
>
> On Wednesday, March 7, 2012 3:35:58 PM UTC+8, Liang Sun wrote:
>>
>> 呵呵,这么严格的区分倒是第一次听说。
>> 维基百科上说UTF32和UCS4除了语义上的一点区别,实际上是完全相同的。而UTF16也包含了UCS2的绝大部分,可以说UCS2是UTF-16的子集。
>> 您说“utf8和utf16的编码相同”,其中的“编码”指的是什么?
>>
>> 2012/3/7 Lucian <luxin...@gmail.com>
>>>
>>> UCS是 Unicode Character Set, UTF是 UCS Transformation Format ,编码和传输格式是两码事。
>>> python内部的unicode对象是对unicode编码的处理,和utf8没有关系。
>>> 不管是utf8,还是utf16,编码都是相同的,只是传输格式不同。
>>>
>>>
>>> On Tuesday, March 6, 2012 10:43:22 AM UTC+8, Liang Sun wrote:
>>>>
>>>> 如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
>>>> 另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
>>>> 有人能解释下,为什么要用UCS2吗?
>>>
>>> --
>>> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
>>> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 发言: pyth...@googlegroups.com

>>> 退订: python-cn+...@googlegroups.com (向此发空信即退!)


>>> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> 强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
>>
>>
>>
>>
>> --
>> Liang Sun <http://liangsun.org>
>>

> --
> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 发言: pyth...@googlegroups.com

> 退订: python-cn+...@googlegroups.com (向此发空信即退!)

Liang Sun

unread,
Mar 7, 2012, 9:46:38 AM3/7/12
to pyth...@googlegroups.com
听君一席话,胜读十年书啊,哈哈,终于豁然开朗了。

在 2012年3月7日星期三UTC+8下午4时39分47秒,cx写道:

>>> 退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)


>>> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> 强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
>>
>>
>>
>>
>> --
>> Liang Sun <http://liangsun.org>
>>
>
> On Wednesday, March 7, 2012 3:35:58 PM UTC+8, Liang Sun wrote:
>>
>> 呵呵,这么严格的区分倒是第一次听说。
>> 维基百科上说UTF32和UCS4除了语义上的一点区别,实际上是完全相同的。而UTF16也包含了UCS2的绝大部分,可以说UCS2是UTF-16的子集。
>> 您说“utf8和utf16的编码相同”,其中的“编码”指的是什么?
>>
>> 2012/3/7 Lucian <luxin...@gmail.com>
>>>
>>> UCS是 Unicode Character Set, UTF是 UCS Transformation Format ,编码和传输格式是两码事。
>>> python内部的unicode对象是对unicode编码的处理,和utf8没有关系。
>>> 不管是utf8,还是utf16,编码都是相同的,只是传输格式不同。
>>>
>>>
>>> On Tuesday, March 6, 2012 10:43:22 AM UTC+8, Liang Sun wrote:
>>>>
>>>> 如果Python内部使用UTF-8的话,很多关于Python的编码问题就灰飞烟灭了。
>>>> 另外,很多Python的文档把UCS2编码说成Unicode编码,这给很多人造成了困惑,其实Unicode编码是一个标准,它的实现可以是UCS2,UTF-8,UTF-16,UTF-32。
>>>> 有人能解释下,为什么要用UCS2吗?
>>>
>>> --
>>> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
>>> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 发言: pyth...@googlegroups.com

>>> 退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)


>>> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> 强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
>>
>>
>>
>>
>> --
>> Liang Sun <http://liangsun.org>
>>
> --
> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 发言: pyth...@googlegroups.com

> 退订: python-cn+unsubscribe@googlegroups.com (向此发空信即退!)

Samuel Ji

unread,
Mar 7, 2012, 10:56:33 PM3/7/12
to pyth...@googlegroups.com
在 2012年3月7日 下午4:39,CHEN Xing <cxcx...@gmail.com>写道:
2012/3/6 Lucian <luxin...@gmail.com>
>
> 维基百科对于普通人来讲还是很权威的,但是对于专业人士未必非常准确,所以对维基不必尽信。
> UCS规定了怎么用多个字节表示字符,UCS有两种格式: UCS-2和UCS-4。顾名思义,UCS-2用两个字节编码,UCS-4用四个字节编码(实际上只用了31位,首位必须为0)。
> UCS-4分为128个group,每个group分为256个plane,每个plane分为256个row,每个row分为256个cell。其中group0的plane0即我们熟知的BMP。
> BMP前两个字节都为0,去掉两个零字节就是UCS-2。
> 常见的UTF有utf-8,utf-16。utf-8以字节为单位对UCS进行编码,utf-16以两个字节为单位对UCS编码。双字节编码还存在字节序的问题,utf-8是单字节编码没有字节符。

如此咬文嚼字其实意思不大,但Wikipedia上的说法一般是有道理的,怀疑它还需相当谨慎。

顾名思义,UCS是个字符集,但UCS-2和UCS-4都是与该字符集相关的编码方式。UTF-8、UTF-16、UTF-32同样是编码方式。

所以:

2012/3/6 Lucian <luxin...@gmail.com>
>
> UCS是 Unicode Character Set, UTF是 UCS Transformation Format ,编码和传输格式是两码事。
> python内部的unicode对象是对unicode编码的处理,和utf8没有关系。

同意。

> 不管是utf8,还是utf16,编码都是相同的,只是传输格式不同。

他们确实都是UCS中字符的表示方式,但是是不同的。一般所讲的encoding,是要注重真正"编码"到字节流的,所以UTF-8和UTF-16是两种不同的编码。在Python中,encoding也是这个意思。

当然,如果说"编码"是一个字到一个整数(code
point)的映射,那么UTF-8和UTF-16都是在这个映射的基础上将字符转为字节流的。但我个人未见以这种方式阐释"编码"的。

编码可以是名词也可以是动词
字符集(charset)很多时候也被叫做编码,比如chrome的工具菜单下面的编码就是指charset;而动词encode也被叫做编码
引一下wikipedia:

Unicode的编码和实现

大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。


Lucian说的编码都是动词指的是实现方式;

CHEN Xing说的编码有时候是名词,有时候是动词,就混淆了概念.


CHEN Xing

unread,
Mar 8, 2012, 12:22:45 AM3/8/12
to pyth...@googlegroups.com
2012/3/7 Samuel Ji <princeofd...@gmail.com>:
>
>
> 编码可以是名词也可以是动词
对的,encoding和encode都是“编码”,但这没啥影响。。

> 字符集(charset)很多时候也被叫做编码,比如chrome的工具菜单下面的编码就是指charset;而动词encode也被叫做编码

还真看了一下,Chrome中的编码明明是encoding...译做编码,UTF-8和UTF-16也确实被认为是两种编码。所以,“不管是utf8,还是utf16,编码都是相同的”一句,与这种广受采纳的“编码”翻译不一致,有人因为生了疑问,故解释了一下。

> 引一下wikipedia:
>
> Unicode的编码和实现
>
> 大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。

此处的“编码”,指的完全是另外一个东西,如我上封信里所说的,是指从字符到code
point的映射。实质上,它对应的是英文中的mapping(即映射)过程(
http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters
),这个映射在Unicode标准下是惟一的。由于是把字符“编”成整数了,故将这一过程称为“编码”也是有道理的。确实,不论是UTF-8还是UTF-16,甚至是GB-180380,其在此含义下的“编码”过程都是一致的。

到这里,“编码”已经体现出两种含义了,一是encoding,一是mapping from a character to a
codepoint。也即我昨天说的对”编码“的两种理解方式。同样也是Lucian说“UTF-8和UTF-16编码相同”的原因。

我想这是Lucian的本意是:UTF-8、UTF-16是两种不同的编码(encoding),但其背后遵循的编码(从字符到code
point的mapping)相同。这是正确的。只是后面的这个“编码”,只有在很强的语境中或很明确的解释下才好避免歧义,这里本线索前面似乎都在讨论encoding这个“编码”,要意识到这个“编码”含义的变化,我觉得是挺有难度的。

> Lucian说的编码都是动词指的是实现方式;
恰恰相反,我认为Lucian说的“编码”是你引文中的“编码方式”,即mapping的过程,不是encoding的过程。

> CHEN Xing说的编码有时候是名词,有时候是动词,就混淆了概念.
词性不是关键,含义是关键。具体的前面已经解释了。

我跟Lucian观点可能不太一样的是,我认为依照英文Wikipedia的描述,UCS-2和UCS-4也是encoding,其性质与UTF-8、UTF-16等是相同的,都是对UCS字符集中部分或全部字符编码(encode)的一种方式,而并非一种特殊的UCS字符集,也不是UCS的“格式”。

Samuel Ji

unread,
Mar 8, 2012, 1:42:37 AM3/8/12
to pyth...@googlegroups.com
在 2012年3月8日 下午1:22,CHEN Xing <cxcx...@gmail.com>写道:
2012/3/7 Samuel Ji <princeofd...@gmail.com>:
>
>
> 编码可以是名词也可以是动词
对的,encoding和encode都是“编码”,但这没啥影响。。

> 字符集(charset)很多时候也被叫做编码,比如chrome的工具菜单下面的编码就是指charset;而动词encode也被叫做编码

还真看了一下,Chrome中的编码明明是encoding...译做编码,UTF-8和UTF-16也确实被认为是两种编码。所以,“不管是utf8,还是utf16,编码都是相同的”一句,与这种广受采纳的“编码”翻译不一致,有人因为生了疑问,故解释了一下。

> 引一下wikipedia:
>
> Unicode的编码和实现
>
> 大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。

此处的“编码”,指的完全是另外一个东西,如我上封信里所说的,是指从字符到code
point的映射。实质上,它对应的是英文中的mapping(即映射)过程(
http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters
),这个映射在Unicode标准下是惟一的。由于是把字符“编”成整数了,故将这一过程称为“编码”也是有道理的。确实,不论是UTF-8还是UTF-16,甚至是GB-180380,其在此含义下的“编码”过程都是一致的。

到这里,“编码”已经体现出两种含义了,一是encoding,一是mapping from a character to a
codepoint。也即我昨天说的对”编码“的两种理解方式。同样也是Lucian说“UTF-8和UTF-16编码相同”的原因。

我想这是Lucian的本意是:UTF-8、UTF-16是两种不同的编码(encoding),但其背后遵循的编码(从字符到code
point的mapping)相同。这是正确的。只是后面的这个“编码”,只有在很强的语境中或很明确的解释下才好避免歧义,这里本线索前面似乎都在讨论encoding这个“编码”,要意识到这个“编码”含义的变化,我觉得是挺有难度的。
同意
 

> Lucian说的编码都是动词指的是实现方式;
恰恰相反,我认为Lucian说的“编码”是你引文中的“编码方式”,即mapping的过程,不是encoding的过程。
仔细看下,Lucian说的编码也不全是同一个意思
 

> CHEN Xing说的编码有时候是名词,有时候是动词,就混淆了概念.
词性不是关键,含义是关键。具体的前面已经解释了。

我跟Lucian观点可能不太一样的是,我认为依照英文Wikipedia的描述,UCS-2和UCS-4也是encoding,其性质与UTF-8、UTF-16等是相同的,都是对UCS字符集中部分或全部字符编码(encode)的一种方式,而并非一种特殊的UCS字符集,也不是UCS的“格式”。
 
还是看英文原文好些.
UTF-8, a transformation format of ISO 10646
1.  Introduction
   ISO/IEC 10646-1 [ISO-10646] defines a multi-octet character set
   called the Universal Character Set (UCS), which encompasses most of
   the world's writing systems.  Two multi-octet encodings are defined,
   a four-octet per character encoding called UCS-4 and a two-octet per
   character encoding called UCS-2, able to address only the first 64K
   characters of the UCS (the Basic Multilingual Plane, BMP), outside of
   which there are currently no assignments.

Q: What is the difference between UCS-2 and UTF-16?

A: UCS-2 is obsolete terminology which refers to a Unicode implementation up to Unicode 1.1, before surrogate code points and UTF-16 were added to Version 2.0 of the standard. This term should now be avoided.

UCS-2 does not define a distinct data format, because UTF-16 and UCS-2 are identical for purposes of data exchange. Both are 16-bit, and have exactly the same code unit representation.

Sometimes in the past an implementation has been labeled "UCS-2" to indicate that it does not support supplementary characters and doesn't interpret pairs of surrogate code points as characters. Such an implementation would not handle processing of character properties, code point boundaries, collation, etc. for supplementary characters. [AF]

--

Lan Soda

unread,
Mar 8, 2012, 9:41:03 PM3/8/12
to pyth...@googlegroups.com
各位说了那么多,各执己见看得人不知所云,哪位能否做个总结,权威的,各位都认可的?


--

赖勇浩

unread,
Mar 8, 2012, 10:25:19 PM3/8/12
to pyth...@googlegroups.com
2012/3/6 Qiangning Hong <hon...@douban.com>:

> 2012/3/6 Liang Sun <i...@liangsun.org>
>>
>> 原来如此。。。
>> 刚才查了一下,UCS2确实不能表示所有的字符,比如太玄经的字符就不能表示,呵呵
>> 我知道无论UTF-8,UTF-32,还是UTF-16都是变长的。。。
>>
>> 然而无论如何,(个人观点)py2由于历史原因用了UCS2,py3是时候放弃UCS2了,就单凭不能表示所有字符这一点,至于用哪个其他的,需要仔细考虑下,不知道你们怎么看的?
>
>
> 编译Python时用 --enable-unicode=ucs4
>
> 看我05年的blog http://hongqn.livejournal.com/4549.html
真经啊!
学到了!

>
>
> --
> 洪强宁 Qiangning Hong
> http://www.douban.com/people/hongqn/
> twitter: @hongqn
>
> --
> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 发言: pyth...@googlegroups.com
> 退订: python-cn+...@googlegroups.com (向此发空信即退!)

> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> 强烈: 建议使用技巧: 如何有效地报告Bug
> http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

--
web site:http://laiyonghao.com
twitter: http://twitter.com/laiyonghao

Liang Sun

unread,
Nov 18, 2012, 10:10:58 PM11/18/12
to pyth...@googlegroups.com
这么长时间都没有人来总结,作为楼主,我斗胆暂且总结一下这个帖子吧,如果大家有不同意的地方,可以继续讨论。

1. UCS2不能表示所有字符, UTF8,UTF16, UTF32(UCS4)可以表示所有字符。(这里还是依据Wikipedia,把UTF32和UCS4看作同一种编码。)
2. UCS2, UCS4(UTF32)是定长的编码方式,而UTF8,UTF16是变长的。
3. Python内部不使用UTF8的原因是因为变长,而定长的编码方式更适合本地操作。
4. 变长编码更适合网络传输,因为可以节省流量。
5. Win32使用UTF16,但仅限于系统内核和IE浏览器,提供给外部程序的API只能使用UCS2。
6. Python早期使用UCS2,但现代的机器大部分都默认使用UCS4。也可以编译Python时指定使用UCS2还是UCS4,详见:
http://hongqn.livejournal.com/4549.html


在 2012年3月6日星期二UTC+8上午10时43分22秒,Liang Sun写道:

est

unread,
Nov 19, 2012, 1:41:57 AM11/19/12
to pyth...@googlegroups.com
我觉得unicode搞一套code point就是傻X行为。硬生生的把UNIcode搞成了MULTIcode。

更傻X的是微软把ucs2编码叫unicode编码。造成了更多人的混乱。




2012/3/8 CHEN Xing <cxcx...@gmail.com>

依云

unread,
Nov 19, 2012, 2:21:29 AM11/19/12
to pyth...@googlegroups.com
On Mon, Nov 19, 2012 at 02:41:57PM +0800, est wrote:
> 我觉得unicode搞一套code point就是傻X行为。硬生生的把UNIcode搞成了MULTIcode。
>
> 更傻X的是微软把ucs2编码叫unicode编码。造成了更多人的混乱。

微软不一直这样么?比如把页面文件叫虚拟内存什么的。

--
Best regards,
lilydjwg

Linux Vim Python 我的博客:
http://lilydjwg.is-programmer.com/
--
A: Because it obfuscates the reading.
Q: Why is top posting so bad?

Liang Sun

unread,
Nov 19, 2012, 3:36:27 AM11/19/12
to pyth...@googlegroups.com
我觉得Python里的Unicode的说法也有问题,其实在Python中Unicode是一种对象类型,就像str一样,是一个类型,而初学者往往以为它就是像Wikipedia上说的一样,是一种编码方式。我初学Python的时候为此困惑了好久。各位怎么看?

est

unread,
Nov 19, 2012, 4:18:17 AM11/19/12
to pyth...@googlegroups.com
python的unicode对象就不应该出现 \x 开头的字符。都应该全部 \u 。而且unicode对象就不应该支持 decode 方法。这个给初学者也造成太多pitfail。

str也不应该支持encode()方法。

/纯吐槽


2012/11/19 Liang Sun <i...@liangsun.org>
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)

Leo Jay

unread,
Nov 19, 2012, 5:16:32 AM11/19/12
to python-cn:CPyUG
2012/11/19 est <electr...@gmail.com>:

> python的unicode对象就不应该出现 \x 开头的字符。都应该全部 \u 。而且unicode对象就不应该支持 decode
> 方法。这个给初学者也造成太多pitfail。
>
> str也不应该支持encode()方法。
>

没道理str不应该支持encode方法,为啥str不能做某种编码呢?
比方说 s.encode('base64'), s.encode('zip')不是挺好么?

> /纯吐槽

依云

unread,
Nov 19, 2012, 6:10:20 AM11/19/12
to pyth...@googlegroups.com
On Mon, Nov 19, 2012 at 06:16:32PM +0800, Leo Jay wrote:
> 2012/11/19 est <electr...@gmail.com>:
> > python的unicode对象就不应该出现 \x 开头的字符。都应该全部 \u 。而且unicode对象就不应该支持 decode
> > 方法。这个给初学者也造成太多pitfail。
> >
> > str也不应该支持encode()方法。

不能同意更多。所以我在一切可能的地方使用没有这种坑爹设计的 Python 3。

> 没道理str不应该支持encode方法,为啥str不能做某种编码呢?
> 比方说 s.encode('base64'), s.encode('zip')不是挺好么?

不好,因为编码未知,Python 2 会去用某种默认的,然后你就得到了
UnicodeEncodeError: 'ascii' codec cannot encode xxx。

依云

unread,
Nov 19, 2012, 8:02:06 AM11/19/12
to pyth...@googlegroups.com
所以 Python 3.3 用 UCS4 没得选了 :-)

「很多Python的文档」?不包括 Python 官方文档吧?至少它没说 UCS2。

存储和传输使用 UTF-8 的另一个好处是即使出错也是错一两个字符,不像定长编
码少一个字节后边的就全错了。

还有,Python 3.3 使用了另外一种「变长」的方式:如果一个字符串所有字符均
不大于 0xff 则每字符使用一字节,如果均不大于 0xffff 则每字符两字节。这样
据说能节约很多内存。

est

unread,
Nov 19, 2012, 8:04:54 AM11/19/12
to pyth...@googlegroups.com
base64或zip 这种完全可以用另外一个方法代替,比如 transencode() 这样。


2012/11/19 Leo Jay <python...@gmail.com>

Leo Jay

unread,
Nov 19, 2012, 8:17:15 AM11/19/12
to python-cn:CPyUG
2012/11/19 依云 <lily...@gmail.com>:

> On Mon, Nov 19, 2012 at 06:16:32PM +0800, Leo Jay wrote:
>> 2012/11/19 est <electr...@gmail.com>:
>> > python的unicode对象就不应该出现 \x 开头的字符。都应该全部 \u 。而且unicode对象就不应该支持 decode
>> > 方法。这个给初学者也造成太多pitfail。
>> >
>> > str也不应该支持encode()方法。
>
> 不能同意更多。所以我在一切可能的地方使用没有这种坑爹设计的 Python 3。
>
>> 没道理str不应该支持encode方法,为啥str不能做某种编码呢?
>> 比方说 s.encode('base64'), s.encode('zip')不是挺好么?
>
> 不好,因为编码未知,Python 2 会去用某种默认的,然后你就得到了
> UnicodeEncodeError: 'ascii' codec cannot encode xxx。
>

编码未知?对一个str对象做base64怎么会编码未知?怎么可能出“UnicodeEncodeError”?
把一个东西以另一种编码方式来表示就叫encode,并不局限于unicode和某种字符串编码之间的转换。
把一个字符串用编码成zip,或是base64,当然也叫encode,这个时候跟unicode一点关系都没有。
怎么可以因为对一个二进制流做encode('utf8')没有意义就把整个encode方法去掉呢?

依云

unread,
Nov 19, 2012, 8:40:08 AM11/19/12
to pyth...@googlegroups.com
啊啊啊,我混淆了 Python 2 和 3 里的 str 囧rz....

反正对二进制数据 encode('utf-8') 就是不对。.encode('zip') 也是不对的说,
因为那是种文件格式,编码格式只有 gzip 啊 bzip2 啊 xz 啊啥的。
Reply all
Reply to author
Forward
0 new messages