作者Lucemia (生の直感、死の予感)
看板Python
标题Re: [问题] 请问一下unicode的问题
时间Sun Jan 7 01:24:04 2007
: 这方法有效,不过太苦。
: 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.
: <type 'unicode'>
: 所有网站
: <type 'str'>
: 所有网站
: 好了,当我们得到一个 unicode 字串之後,想转成哪种编码都可以随心所欲:
: sjisraw = uniraw.encode("sjis")
: 再用 interactive Python 示范一下:
: ?⑫簛?
: 在 CP950 下出乱码是正常的;不出乱码表示我们写错了。
: 有时候在一些处理字串的程式里我们还会看到如下的 traceback:
: 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 不正确,即使编解码正确,出乱码也是好正常的了。
但是在python需要自动转换code时 要怎麽处理呢?
像我知道在存写档时可以用 codec.open 来取代
但是其他像是在odbc 中的cursor.execute('... 资料..')中
python就会自动将unicode的code转成 ascii
然後就当场挂掉.. 这种问题要怎麽解决比较好?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.88.93