蟒使用可变的字节码翻译为UTF-8(python translate bytecode to utf

2019-10-30 01:41发布

我有以下问题:

从SQL Server数据库中我读使用Python模块pypyodbc和ODBC驱动程序13 SQL Server和写入txt文件的数据。

数据库包含各种特殊字符和他们读作:

'PR\xc3\x86KVAL'

'\xc3\x86'的部分是字节码应该被解释的方式。 如图所示的其他字符应当被解释。 UTF8将转化'\xc3\x86'白纹伊蚊。

如果我输入值b'PR\xc3\x86KVAL' ,蟒蛇将它识别为字节码,我可以把它翻译成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'”)但变量将不会以这种方式工作。

Answer 1:

既然你开始与PR\xc3\x86KVAL作为一个文本字符串decode确实需要一个原始字节序列,您需要将文本字符串转换成字节对象。 但是,从一个“编码”值转换为另一种时,巨蟒需要知道它已经开始用什么编码!

这样做最简单的方法是明确的编码字符串,使用不改变特殊字符的编码。 你必须小心,因为它是非常可能的,一个字符代码可能会被翻译成别的东西,破坏它们的含义。

你可以看到一个简单的例子:试图来告诉Python这应该是纯ASCII失败,一个明显的原因。

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

即使有上堆栈溢出这个1000点多的问题 ,失败的原因应该很容易理解。 所有的编码器/解码器对不是每个字符从“源”到“目的地”的翻译。 如果有问题的角色在这两个“源”和“目的地”的编码实际上存在才能做到这一点。 假设你想一个希腊字符转换β到俄罗斯б ,则源必须能够希腊字符解码(因为那是你进入它)和目标必须能够编码俄文字符。

所以,你必须小心选择不改变字符的编码\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是正确编码的字节对象,这样你就可以随意对其进行解码:

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

完成!



文章来源: python translate bytecode to utf-8 using a variable