作者yungyuc (酷狗喵千代)
看板Python
标题Re: [问题] 请问一下unicode的问题
时间Sun Dec 17 00:10:37 2006
※ 引述《theodolite (无)》之铭言:
: ※ 引述《theodolite (无)》之铭言:
: : 不好意思,小弟又来问问题了,
: : 我用gtk selectionData.get_text()抓到一串中文字,像"所有网站"
: : 这样的字串会回传'\u6240\u6709\u7db2\u7ad9'
: : 长度为24的ascii字串,
: : 像这样的情形,要如何把一个ascii字串转成unicode字串?
: : 不论是用decode或是unicode这两个function似乎还没试出可行的方法。
: 自问自答,我用最笨的方法,split \u,抓出来的再用unichr转成unicode string
: 如果有更好的解法也请指教,谢谢。
这方法有效,不过太苦。
Python 提供 codec 架构进行字码转换,2.3 以後都支援
(更早的版本可能也有,抱歉我不确定)。
在利用 codec 架构进行字码转换之前,
我们要对 Python 提供的唯二字串物件 str 和 unicode 其间的关系,
具有基本的概念。
unicode 存的是 Unicode code point,而 str 可以存任意的 byte list。
在处理字码转换时,概念上要把 unicode 物件当成一种与字码无关的字串型别,
从 unicode 物件「编码」成代表各种字码的 str 物件,
或从以任意字码表示的 str 物件「解码」回 unicode 物件。
具体来讲,假设我们取得的「所有网站」字串是以 utf-8 编码,
而我们想把它转成 unicode 物件,那要这样作:
uniraw = raw.decode('utf8') # raw contain 所有网站 in UTF-8 encoding.
这样得到的 uniraw 会是一个 unicode 物件。
再举一个在 CP950 Windows 下的例子,用 interactive mode Python:
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print type( "所有网站".decode("big5") ) ; print "所有网站".decode("big5")
<type 'unicode'>
所有网站
>>> print type( "所有网站" ) ; print "所有网站"
<type 'str'>
所有网站
>>>
好了,当我们得到一个 unicode 字串之後,想转成哪种编码都可以随心所欲:
sjisraw = uniraw.encode("sjis")
再用 interactive Python 示范一下:
>>> print "所有网站".decode("big5").encode("sjis")
?⑫簛?
>>>
在 CP950 下出乱码是正常的;不出乱码表示我们写错了。
有时候在一些处理字串的程式里我们还会看到如下的 traceback:
>>> print "所有网站".decode("big5").encode("ascii")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordin
al not in range(128)
>>>
很明显,ascii encoding 不可能包含「所有网站」的码域。
在把 str (in Big5) 的「所有网站」解码成 unicode 时不会出问题,
但如果要把 unicode 的「所有网站」编码成 ascii,这是件不可能的任务,
Python 就爆给我们看。
这是应当的,也是合理的,Python 如此行,乃是理所当然的。
如果能弄懂以上的操作,应该就可以掌握 Python 的 unicode 处理了。
当然,实作的时候还有一些要注意的地方。
第一是 Python 的 codec 名称及所支援的 encoding;
尤其 Python 在 2.4 之前是「不支援」Big5 的,要另行安装 cjkcodecs 套件
(感谢韩国人)。
第二是在 interactive mode 中使用 Python 时,要注意终端机的 locale
(在 Windows 下就是 codepage);
locale 不正确,即使编解码正确,出乱码也是好正常的了。
--
写完才觉得自己废话真多。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.134.27.8
1F:推 wawawa:推荐这篇文章 12/17 16:48
2F:推 Raviede:推 :) 12/18 07:49
3F:推 pkyosx:这个问题苦恼我很多次了 感恩 12/23 13:57
4F:推 superGA:push~~ 08/08 18:14