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')
即可。
当然,在某些情况下,这样做可能造成问题,不过,貌似它造成的问题相比它带来的方便而言,实在是微不足道。
- 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/
在 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
原来如此。。。
刚才查了一下,UCS2确实不能表示所有的字符,比如太玄经的字符就不能表示,呵呵
我知道无论UTF-8,UTF-32,还是UTF-16都是变长的。。。
然而无论如何,(个人观点)py2由于历史原因用了UCS2,py3是时候放弃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
python可以使用ucs2或ucs4,且在大部分linux里,使用的是ucs4
http://docs.python.org/c-api/unicode.html#Py_UNICODE
utf8这种变长的编码,只有在序列化的时候用起来比较方便,在内存里表示和处理的时候还是定长来得方便
不然怎么来实现string slice呢?
--
Best Regards,
Leo Jay
目前绝大多数 linux 发行版中,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
UTF-16不是定长编码,UCS-2是,但UCS2的字不全。UCS4算是定长又能表示足够多的字了,但这样一来文本占的内存就大了很多,好奇Windows是具体如何用UTF-16处理这个矛盾的。
CHEN, Xing / 陈醒
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>:
utf-16 虽然不是定长,但大多数情况下他是两个字节,极少数的字用四个字节表示。没有其他的可能。甚至对于不仔细的程序员而言,把它当做
ucs2 也没有太大问题(因为那些四字节编码就算你遇到了不处理,也不可能造成字节错位等“错误传染”问题)。
utf-8 不是定长,他可以是一字节,两字节,三字节,四字节,处理起来相对还是要复杂些的。
>>> 退订: 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 (向此发空信即退!)
--
来自: 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
呵呵,这么严格的区分倒是第一次听说。
维基百科上说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>
呵呵,这么严格的区分倒是第一次听说。
维基百科上说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
如此咬文嚼字其实意思不大,但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 (向此发空信即退!)
>>> 退订: 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 (向此发空信即退!)
2012/3/6 Lucian <luxin...@gmail.com>如此咬文嚼字其实意思不大,但Wikipedia上的说法一般是有道理的,怀疑它还需相当谨慎。
>
> 维基百科对于普通人来讲还是很权威的,但是对于专业人士未必非常准确,所以对维基不必尽信。
> 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是个字符集,但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都是在这个映射的基础上将字符转为字节流的。但我个人未见以这种方式阐释"编码"的。
大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。
Lucian说的编码都是动词指的是实现方式;
CHEN Xing说的编码有时候是名词,有时候是动词,就混淆了概念.
> 字符集(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的“格式”。
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的“格式”。
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]
--
--
--
web site:http://laiyonghao.com
twitter: http://twitter.com/laiyonghao
--邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
没道理str不应该支持encode方法,为啥str不能做某种编码呢?
比方说 s.encode('base64'), s.encode('zip')不是挺好么?
> /纯吐槽
编码未知?对一个str对象做base64怎么会编码未知?怎么可能出“UnicodeEncodeError”?
把一个东西以另一种编码方式来表示就叫encode,并不局限于unicode和某种字符串编码之间的转换。
把一个字符串用编码成zip,或是base64,当然也叫encode,这个时候跟unicode一点关系都没有。
怎么可以因为对一个二进制流做encode('utf8')没有意义就把整个encode方法去掉呢?