字符串编码/解码问题 - 从末尾缺少字符

时间:2016-10-11 13:29:14

标签: python python-2.7 encode pyodbc netezza

我的数据库中有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-8utf-16asciiutf-32,但似乎没有任何效果。

有没有人知道我错过了什么?以及如何从my_string获得所需的结果。

修改在将其转换为utf-16-le时,我可以从开始删除不需要的字符,但结尾时仍然缺少一个字符

>>> print t.encode('utf-16-le')
WAGCenter-04190517953516060503-20160605124857-4190-5

在尝试其他一些列时,它正在运行。 这个间歇性问题可能是什么原因?

2 个答案:

答案 0 :(得分:2)

您在数据库定义中存在一个主要问题,就是存储值的方式,或者您从中读取值的方式。我只能解释你所看到的内容,但无论是为什么,也不知道如何解决它:

  • 数据库的类型
  • 您在其中输入值的方式
  • 提取值以获取伪unicode 字符串
  • 的方式
  • 如果您使用直接(原生)数据库访问
  • ,则为实际内容

你得到的是一个ASCII字符串,其中8位字符按对分组,以小端顺序构建16位unicode字符。由于预期的字符串具有奇数个字符,因此最后一个字符在翻译中(不可挽回地)丢失,因为原始字符串以u'\352d'结尾,其中0x2d是'-'的ASCII代码,{{1}是0x35 }}。演示:

'5'

答案 1 :(得分:1)

问题是,我在UTF-16文件中使用odbcinst.ini,因为我必须使用UTF-8格式的字符编码。

之前我在连接OPTION时将其更改为PyODBC参数。但后来在odbcinst.ini文件中更改它修复了问题。