字符串 encode/decode 问题 - 末尾缺少字符
String encode/decode issue - missing character from end
我的数据库中有 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
在尝试其他一些列时,它正在工作。 此间歇性问题的可能原因是什么?
您的数据库定义、在其中存储值的方式或从中读取值的方式存在重大问题。我只能解释你所看到的,但不能解释为什么或如何在没有以下情况的情况下解决它:
- 数据库的类型
- 您在其中输入值的方式
- 提取值以获取 伪 unicode 字符串的方式
- 使用直接(本地)数据库访问时的实际内容
您得到的是一个 ASCII 字符串,其中 8 位字符成对分组,以小端顺序构建 16 位 unicode 字符。由于预期的字符串有奇数个字符,最后一个字符在翻译中(不可补救地)丢失了,因为原始字符串以 u'2d'
结尾,其中 0x2d 是 '-'
的 ASCII 码,0x35 是 [=13 的=].演示:
def cvt(ustring):
l = []
for uc in ustring:
l.append(chr(ord(uc) & 0xFF)) # low order byte
l.append(chr((ord(uc) >> 8) & 0xFF)) # high order byte
return ''.join(l)
cvt(my_string)
'WAGCenter-04190517953516060503-20160605124857-4190-5'
问题是,我在 odbcinst.ini
文件中使用 UTF-16
,因为我不得不使用 UTF-8
格式的字符编码。
早些时候,我在连接到 PyODBC
时将其更改为 OPTION
参数。但后来在 odbcinst.ini
文件中更改它解决了问题。
我的数据库中有 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
在尝试其他一些列时,它正在工作。 此间歇性问题的可能原因是什么?
您的数据库定义、在其中存储值的方式或从中读取值的方式存在重大问题。我只能解释你所看到的,但不能解释为什么或如何在没有以下情况的情况下解决它:
- 数据库的类型
- 您在其中输入值的方式
- 提取值以获取 伪 unicode 字符串的方式
- 使用直接(本地)数据库访问时的实际内容
您得到的是一个 ASCII 字符串,其中 8 位字符成对分组,以小端顺序构建 16 位 unicode 字符。由于预期的字符串有奇数个字符,最后一个字符在翻译中(不可补救地)丢失了,因为原始字符串以 u'2d'
结尾,其中 0x2d 是 '-'
的 ASCII 码,0x35 是 [=13 的=].演示:
def cvt(ustring):
l = []
for uc in ustring:
l.append(chr(ord(uc) & 0xFF)) # low order byte
l.append(chr((ord(uc) >> 8) & 0xFF)) # high order byte
return ''.join(l)
cvt(my_string)
'WAGCenter-04190517953516060503-20160605124857-4190-5'
问题是,我在 odbcinst.ini
文件中使用 UTF-16
,因为我不得不使用 UTF-8
格式的字符编码。
早些时候,我在连接到 PyODBC
时将其更改为 OPTION
参数。但后来在 odbcinst.ini
文件中更改它解决了问题。