是否仍有提取下划线的方法;“原始数据”;来自python unicode字符串?

是否仍有提取下划线的方法;“原始数据”;来自python unicode字符串?,python,unicode,Python,Unicode,我用pymssql来解决这个问题。我有一个mssql数据库,它的编码是gbk,但pymssql似乎不能支持这一点。当我使用“gbk”作为字符集时,它会抛出一个带有一些无用消息的操作错误20017,而当我尝试使用“cp936”时,它就会崩溃 我可以成功连接“UTF-8”,并可以使用sqlstr.encode('UTF-8')执行查询,问题是它返回包含非unicode内容的unicode sting 例如,一个查询返回一个unicode字符串u'Port 26\xb5\xe7',但这是错误的,它不是

我用pymssql来解决这个问题。我有一个mssql数据库,它的编码是gbk,但pymssql似乎不能支持这一点。当我使用“gbk”作为字符集时,它会抛出一个带有一些无用消息的
操作错误20017
,而当我尝试使用“cp936”时,它就会崩溃

我可以成功连接“UTF-8”,并可以使用
sqlstr.encode('UTF-8')
执行查询,问题是它返回包含非unicode内容的unicode sting

例如,一个查询返回一个unicode字符串
u'Port 26\xb5\xe7'
,但这是错误的,它不是unicode字符串,它根本无法解码/编码,它应该是
'Port 26\xb5\xe7'
(对于python 2.x),因此可以使用gbk对其进行解码并获得正确的结果


因此,我的任务是从unicode字符串中提取原始内容。我想我可以在repr中使用一些字符串截断,然后调用eval,但我只是想知道还有其他类似python的方法吗?

这是你想要的吗

>>> myString = u'Port 26 \xb5\xe7'
>>> print myString.encode('latin1').decode('gbk')
Port 26 电
事实上,您可以使用以下任一项作为编码解码器:

cp1250
cp1252
cp1254
cp1256
cp1258
latin_1
iso8859_3
iso8859_9
iso8859_15

拉丁语1是您的最佳选择(最包容)。列出的cp编解码器都是基于Windows的。

如果所有其他方法都失败,您可以将
u'Port 26\xb5\xe7'
编码为拉丁语-1,然后使用UTF-8进行解码:`result.encode('latin1')。decode('utf8')。但也许是时候切换到其他MySQL连接器了?您是否尝试过
yoursql
?最后但并非最不重要的一点是,当您尝试
cp936
时,您看到的异常是什么?@MartijnPieters--
。解码('utf-8')
将引发异常-您必须使用
gpk
cp936
(当然您对
拉丁语-1
部分的理解是正确的)。是的,我的意思是
gbk
。你是对的,我运行了一些测试代码,比如:`for I in xrange(256):print I,repr(chr(I).decode('iso8859_3')),只有拉丁字母1工作正常,cp1256毫无例外地运行,但一些字符被转换为unicode字符('\uxxx'),而其他编码则以解码异常结束。感谢您的额外承诺,拉丁语_1/cp1250将有0-255范围内的字节直接映射到原始字节。