解码 Ebcdic

Decoding Ebcdic

我正在传递 ebcdic 编码的数据。类似于:

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

尝试 .decode('cp500') 是错误的,但正确的做法是什么?如果我将字符串复制到 Notepad++ 之类的东西中,我可以将它从 EBCDIC 转换为 ascii,但我似乎无法在 python 中找到实现相同目的的可行方法。对于它的价值,正确的结果是:BOISE ID(加上或减去 space 填充)。

正在从包含 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 序号的值作为字节,然后使用 cp500 对其进行解码。

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

或者:

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

如果 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 3 open 到 Python 2.x,codecs/TextWrapper 和通用换行支持