解码EBCDIC

5

我将收到一个 ebcdic 编码的数据。 类似于:

s = u'@@@@@@@@@@@@@@@@@@@ÂÖÉâÅ@ÉÄ'

尝试使用.decode('cp500')是错误的,但正确的方法是什么?如果我将字符串复制到像Notepad++这样的软件中,我可以将其从EBCDIC转换为ascii,但我似乎找不到在Python中实现相同目的的可行方法。值得一提的是,正确的结果是:BOISE ID(加或减空格填充)。
该信息是从包含JSON对象行的文件中检索出来的。该文件如下所示:
{ "command": "flush-text", "text": "@@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O" }
{ "command": "flush-text", "text": "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\u00C9\u00C4@\u00D5\u00A4\u0094\u0082\u0085\u0099z@@@@@@@@@@\u00D9\u00F5\u00F9\u00F7\u00F6\u00F8\u00F7\u00F2\u00F4" }
{ "command": "flush-text", "text": "@@@@@OmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmO" }
{ "command": "flush-text", "text": "@@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O" }

处理循环大致如下:

with open('myfile.txt', 'rb') as fh:
  for line in fh:
    data = json.loads(line)

编码还是解码?为什么要解码Unicode字符串?难道不应该解码字节字符串吗? - 200_success
同意。但是...我已经得到了一个Unicode字符串 - 它来自于json.loads。说实话,这有点混乱。但是我正在努力想办法从我手头的东西转换成我需要的东西。 - g.d.d.c
听起来你并不清楚你要处理的内容是什么。 - holdenweb
你在使用Python 2还是3? - cdarke
4
你能否在你的Python脚本中添加一个简短的片段,说明如何获取这些数据?如果数据来自一个文件,那么也许你应该以正确的编码方式打开它... - flaschbier
@cdarke - 2. 我曾考虑过尝试使用3,但我不确定我正在使用的库是否都兼容。 - g.d.d.c
2个回答

4
如果Notepad++可以成功转换,那么您只需要: Python 2.7:
with io.open('myfile.txt', 'r', encoding="cp500") as fh:
  for line in fh:
    data = json.loads(line)

Python 3.x:

with open('myfile.txt', 'r', encoding="cp500") as fh:
  for line in fh:
    data = json.loads(line)

这里使用了TextWrapper来解码文件并使用给定的编码格式读取。io模块为Python 2.x提供了Python 3的open函数,同时支持codecs/TextWrapper和通用换行符。

3

我猜你需要相应Unicode序号的值作为字节,然后用cp500进行解码。

>>> s = u'@@@@@@@@@@@@@@@@@@@ÂÖÉâÅ@ÉÄ'
>>> bytearray(ord(c) for c in s).decode('cp500')
u'                   BOISE ID'

或者:

>>> s.encode('latin-1').decode('cp500')
u'                   BOISE ID'

这个答案是正确的,但我对测试io模块更感兴趣,所以我选择了那种方法。 - g.d.d.c
@g.d.d.c 另一个答案是正确的方法。我假设你从某个地方获取了你的Unicode字符串,并且必须处理你得到的内容。 - timgeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接