【问题标题】:python translate bytecode to utf-8 using a variablepython使用变量将字节码转换为utf-8
【发布时间】:2018-04-10 06:28:12
【问题描述】:

我有以下问题:

从 SQL Server 数据库中,我使用 Python 模块 pypyodbc 和 ODBC Driver 13 for SQL Server 读取数据并写入 txt 文件。

数据库包含各种特殊字符,它们读作:

'PR\xc3\x86KVAL'

'\xc3\x86' 部分是字节码,应该这样解释。其他字符应如图所示进行解释。 UTF8 会将'\xc3\x86' 翻译成Æ。

如果我在 b'PR\xc3\x86KVAL' 中输入值,python 会将其识别为字节码,我可以将其转换为 PRÆKVAL。见下文:

s = b'PR\xc3\x86KVAL'
print(s)
bb = s.decode('utf-8')
print(bb)

问题是我不知道如何将'PR\xc3\x86KVAL’ 识别为字节码对象。

我希望必须解码的值是一个变量,以便数据库中的所有数据都可以流过它。

我也试过ast.literal_eval(r”b'PR\xc3\x86KVAL'”),但是变量不能这样工作。

【问题讨论】:

    标签: python-3.x bytecode pypyodbc


    【解决方案1】:

    由于您以PR\xc3\x86KVAL 作为文本字符串 开始,而decode 确实需要原始字节序列,因此您需要将文本字符串转换为字节对象。但是当从一个“编码”值转换为另一个时,Python 需要知道它是从什么编码开始的!

    最简单的方法是显式编码字符串,使用不改变特殊字符的编码。您必须小心,因为字符代码很可能会被翻译成其他东西,从而破坏它们的含义。

    您可以通过一个简单的示例看到这一点:试图告诉 Python 这应该是纯 ASCII 失败,原因很明显。

    >>> s = 'PR\xc3\x86KVAL'.encode('ascii')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)
    

    虽然有more than 1,000 questions on Stack Overflow about this,但失败的原因应该很容易理解。编码器/解码器对所做的只是将每个字符从“源”转换为“目标”。这只有在有问题的字符在“源”和“目标”编码中都存在时才有效。假设您要将希腊字符 β 翻译成俄语 б,那么源 必须 能够解码希腊字符(因为这是您输入的内容)和目标 必须能够编码俄语字符。

    因此,您必须小心选择不会将输入字符串中的字符 \x86 更改为 Ж 的编码(例如,在使用 cp866 时会这样做)。

    幸运的是,正如https://stackoverflow.com/a/2617930/2564301 所引用的,有一种编码不会搞砸:

    data.decode('latin1') 传递给编解码器。 latin1 将字节 0-255 映射到 Unicode 字符 0-255,这有点优雅。

    所以这应该可以工作:

    >>> s = 'PR\xc3\x86KVAL'.encode('latin1')
    >>> print(s)
    b'PR\xc3\x86KVAL'
    

    现在s是一个正确编码的byte对象,所以你可以随意解码:

    >>> bb = s.decode('utf-8')
    >>> print(bb)
    PRÆKVAL
    

    完成!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 2022-01-09
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      相关资源
      最近更新 更多