2013-02-17 21 views
4

另一個編碼問題,我正在處理IBM大型機使用IBM870編碼,這是python不支持或沒有其他的東西。如何添加一個新的編碼到python 2.6?

幸運的是颳起了對於使用字符蟒蛇產生相應的編碼定義的腳本一個有天賦的編碼器列出了FileFormat.info

availble的使用的列表是這一個:IBM870 character list

生成的編碼可以在這裏看到:cp870.py

在考慮中的系統是一個RHEL 6.3運行蟒2.6:

Python 2.6.6 (r266:84292, Aug 28 2012, 10:55:56) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2 

的cp870.py被放置在:

/usr/lib64/python2.6/encodings/ 

下列條目已經被添加到:

/usr/lib64/python2.6/encodings/aliases.py 

# cp870 codec 
'870'    : 'cp870', 
'csibm870'   : 'cp870', 
'ibm870'    : 'cp870', 

別名被正確解析爲這裏看到(thanks to this answer):

>>> from encodings.aliases import aliases 
>>> def find(q): 
...  return [(k,v) for k, v in aliases.items() if q in k or q in v] 
... 
>>> find('870') 
[('ibm870', 'cp870'), ('870', 'cp870'), ('csibm870', 'cp870')] 
>>> find('cp870') 
[('ibm870', 'cp870'), ('870', 'cp870'), ('csibm870', 'cp870')] 
>>> find('ibm870') 
[('ibm870', 'cp870'), ('csibm870', 'cp870')] 

當我嘗試編碼()某些字符時,它不按計劃工作:

>>> 'c'.encode('cp870') 
'\x83' 
>>> 'č'.encode('cp870') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.6/encodings/cp870.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) 

這是什麼「\ X83」應該根據cp870.py是:

u'\x83'  # 0x23 -> NO BREAK HERE (U+0083) 

由於我是新手到Python可能有人指教我,以便需要別的什麼蟒蛇正常加載並使用這種編碼?

+0

我嘗試上述步驟的Python 2.7,armscii8但是,它不承認在aliases.py中添加了鍵/值對除了上述步驟外,還有什麼需要做的嗎?謝謝 – user2431012 2014-11-12 14:59:32

回答

3

在Python 2.x中,Unicode字符串必須標有前綴üü。沒有前綴的字符串是ASCII(或其他8位編碼)。此外,python希望你的輸入是ASCII編碼的(儘管可以配置另一種編碼)。因此,當您將非ASCII字符放在引號中時,解釋器會嘗試將其解碼爲ASCII,這會導致您看到的錯誤。

因此,你需要特異性的ü前綴,並使用轉義序列到指定字符:

U'\x83'.encode('cp870') 
+1

@f10bit:如果你確實想按照你所展示的方式輸入可讀的文本,你可以首先將它解碼爲unicode,無論你的控制檯能夠理解什麼編碼,然後將它編碼爲cp870編碼。 – alexis 2013-02-17 23:57:30

+0

謝謝兩位的解釋,這就是我一直想念,結果一切似乎工作: '>>>'đ'.decode('utf8')' 'u'\ u0111'' ' >>> u'\ u0111'.encode('cp870')' ''\ x8c'' 以下是來自cp870的相關行。py: 'u'\ u0111'#0x8C - >拉丁小寫字母D帶筆畫(U + 0111)' – f10bit 2013-02-18 13:15:38

相關問題