我的数据库中有NVARCHAR
类型列。我无法在我的代码中将此列的内容转换为纯字符串。 (我使用pyodbc
进行数据库连接。)
# This unicode string is returned by the database
>>> my_string = u'\u4157\u4347\u6e65\u6574\u2d72\u3430\u3931\u3530\u3731\u3539\u3533\u3631\u3630\u3530\u3330\u322d\u3130\u3036\u3036\u3135\u3432\u3538\u2d37\u3134\u3039\u352d'
# prints something in chineese
>>> print my_string
䅗䍇湥整㐰㤱㔰㜱㔹㔳㘱㘰㔰㌰㈭〶〶ㄵ㐲㔸ⴷㄴ〹㔭
我最接近的是将其编码为utf-16
:
>>> my_string.encode('utf-16')
'\xff\xfeWAGCenter-04190517953516060503-20160605124857-4190-5'
>>> print my_string.encode('utf-16')
��WAGCenter-04190517953516060503-20160605124857-4190-5
但是我根据数据库中的值存储所需的实际值是:
WAGCenter-04190517953516060503-20160605124857-4190-51
我尝试将其编码为utf-8
,utf-16
,ascii
,utf-32
,但似乎没有任何效果。
有没有人知道我错过了什么?以及如何从my_string
获得所需的结果。
修改:在将其转换为utf-16-le
时,我可以从开始删除不需要的字符,但结尾时仍然缺少一个字符
>>> print t.encode('utf-16-le')
WAGCenter-04190517953516060503-20160605124857-4190-5
在尝试其他一些列时,它正在运行。 这个间歇性问题可能是什么原因?
答案 0 :(得分:2)
您在数据库定义中存在一个主要问题,就是存储值的方式,或者您从中读取值的方式。我只能解释你所看到的内容,但无论是为什么,也不知道如何解决它:
你得到的是一个ASCII字符串,其中8位字符按对分组,以小端顺序构建16位unicode字符。由于预期的字符串具有奇数个字符,因此最后一个字符在翻译中(不可挽回地)丢失,因为原始字符串以u'\352d'
结尾,其中0x2d是'-'
的ASCII代码,{{1}是0x35 }}。演示:
'5'
答案 1 :(得分:1)
问题是,我在UTF-16
文件中使用odbcinst.ini
,因为我必须使用UTF-8
格式的字符编码。
之前我在连接OPTION
时将其更改为PyODBC
参数。但后来在odbcinst.ini
文件中更改它修复了问题。