- 論壇徽章:
- 0
|
字符串內(nèi)碼的轉(zhuǎn)換,是開發(fā)中經(jīng)常遇到的問題。
在Java中,我們可以先對(duì)某個(gè)String調(diào)用getByte(),由結(jié)果生成新String的辦法來轉(zhuǎn)碼,也可以
用NIO包里面的Charset來實(shí)現(xiàn)
。
在Python中,可以對(duì)String調(diào)用decode和encode方法來實(shí)現(xiàn)轉(zhuǎn)碼。
比如,若要將某個(gè)String對(duì)象s從gbk內(nèi)碼轉(zhuǎn)換為UTF-8,可以如下操作
s.decode('gbk').encode('utf-8')
可是,在實(shí)際開發(fā)中,我發(fā)現(xiàn),這種辦法經(jīng)常會(huì)出現(xiàn)異常:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 30664-30665: illegal multibyte sequence
這是因?yàn)橛龅搅朔欠ㄗ址绕涫窃谀承┯肅/C++編寫的程序中,全角空格往往有多種不同的實(shí)現(xiàn)方式,比如\xa3\xa0,或者\(yùn)xa4\x57,這些字符,看起來都是全角空格,但它們并不是“合法”的全角空格(真正的全角空格是\xa1\xa1),因此在轉(zhuǎn)碼的過程中出現(xiàn)了異常。
這樣的問題很讓人頭疼,因?yàn)橹灰址谐霈F(xiàn)了一個(gè)非法字符,整個(gè)字符串——有時(shí)候,就是整篇文章——就都無法轉(zhuǎn)碼。
幸運(yùn)的是,tiny找到了完美的解決辦法(我因此被批評(píng)看文檔不仔細(xì),汗啊……)
s.decode('gbk', 'ignore').encode('utf-8')
因?yàn)閐ecode的函數(shù)原型是decode([encoding], [errors='strict']),可以用第二個(gè)參數(shù)控制錯(cuò)誤處理的策略,默認(rèn)的參數(shù)就是strict,代表遇到非法字符時(shí)拋出異常;
如果設(shè)置為ignore,則會(huì)忽略非法字符;
如果設(shè)置為replace,則會(huì)用?取代非法字符;
如果設(shè)置為xmlcharrefreplace,則使用XML的字符引用。
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/13255/showart_357281.html |
|