将Ruby脚本转换为Python-字节编码/解码问题

将Ruby脚本转换为Python-字节编码/解码问题,ruby,python-3.x,encoding,decoding,Ruby,Python 3.x,Encoding,Decoding,我正在尝试将ruby脚本转换为python脚本。脚本应该读取二进制文件并将其转换为可读字符串。二进制文件包含一些韩语符号。我尝试了多种编码,但似乎都不起作用。最后,数据应该被格式化成一个表。在本代码中没有看到,只是为了更好地理解而提到 ruby脚本运行良好,没有任何问题 我不确定是否需要测试文件,但我已经上传了它 谢谢你帮了我!: Ruby脚本: 我认为主要的问题是,在ruby中将用作正则表达式分隔符的斜杠也放在python字符串中,这破坏了替换。 改变 到 而且应该会更好 我还需要在各种解包调

我正在尝试将ruby脚本转换为python脚本。脚本应该读取二进制文件并将其转换为可读字符串。二进制文件包含一些韩语符号。我尝试了多种编码,但似乎都不起作用。最后,数据应该被格式化成一个表。在本代码中没有看到,只是为了更好地理解而提到

ruby脚本运行良好,没有任何问题

我不确定是否需要测试文件,但我已经上传了它

谢谢你帮了我!:

Ruby脚本:


我认为主要的问题是,在ruby中将用作正则表达式分隔符的斜杠也放在python字符串中,这破坏了替换。 改变

而且应该会更好

我还需要在各种解包调用中用I替换l,我不完全确定这是否正常,但这对我来说很有效

来自d的样本输出

ISLAND_00
카디프섬#
カ?ディフ島#
Cardiff Island#
Cardiff Island#
Cardiff Island#
Cardiff Island#
Cardiff Island#
Cardiff Island#
Cardiff Island#
?迪夫?#
?迪夫島#
ISLAND_01
마그넬 섬#
マグネル島#
# encoding: utf-8
import struct
import re

def columntypes(t):
    if t == 0:
        return 4
    elif t == 1:
        return 4
    elif t == 2:
        return 4
    elif t == 3:
        return 12
    elif t == 4:
        return 32
    elif t == 5:
        return 128
    else:
        return 0

doc = open("test.bin", "rb")

b = {
    "datasets": struct.unpack("l", doc.read(4))[0],
    "datasets_length": struct.unpack("l", doc.read(4))[0],
    "columns": struct.unpack("l", doc.read(4))[0],
}

columns = []
for x in range(b["columns"]):
    data = doc.read(32)
    data = re.sub(b"/\x00.*/", b"", data)
    data = data.decode("utf-8")
    name = data.rstrip("\x00")

    columns.append(
        {
            "name": name,
            "length": columntypes(struct.unpack("l", doc.read(4))[0])
        }
    )

datasets = []
for x in range(b["datasets"]):
    trash = doc.read(4)
    dataset = []
    for c in columns:
        data = doc.read(c["length"])

        if c["length"] != 4:
            data = re.sub(b"/\x00.*/", b"", data)
            # Error here
            # Encodings tried: utf-8, euc_kr, cp949
            d = data.decode("utf-8").rstrip("\x00")

            datasets.append(d)

        else:
            datasets.append(struct.unpack("L", data)[0])

doc.close()
         data = re.sub(b"/\x00.*/", b"", data)
         data = re.sub(b"\x00.*", b"", data)
ISLAND_00
카디프섬#
カ?ディフ島#
Cardiff Island#
Cardiff Island#
Cardiff Island#
Cardiff Island#
Cardiff Island#
Cardiff Island#
Cardiff Island#
?迪夫?#
?迪夫島#
ISLAND_01
마그넬 섬#
マグネル島#