我有以下问题:
从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'”)
但变量将不会以这种方式工作。
既然你开始与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
完成!