将UTF-16特殊字符转换为UTF-8
我在使用Django和Python的时候,遇到了一个问题,就是在PostgreSQL数据库中保存utf-16字符时出现了麻烦。请问有没有什么方法可以在保存之前把utf-16转换成utf-8呢?
我用的是Python 2.6,这里是我的代码片段:
sample_data="This is the time of year when Travel & Leisure, TripAdvisor and other travel media trot out their “Best†lists, so I thought I might share my own list of outstanding hotels I’ve had the good fortune to visit over the years."
上面的数据包含了一些拉丁特殊字符,但显示得不太正确。我只是想把这些拉丁特殊字符以合适的格式显示出来。
2 个回答
这个方法对我有效,可以用来转换字符串:sample_data.decode('mbcs').encode('utf-8')
其实并没有什么“utf-16字符”。你应该用 print repr(data)
来显示你的数据,并告诉我们你在数据的哪些部分遇到了问题。给我们看一下你数据的本质,比如“Leisure “Best†lists I’ve had”的repr()。
你实际上拥有的是一串字节,这些字节包含了用UTF-8编码的文本。它的表示形式是:
'Leisure \xe2\x80\x9cBest\xe2\x80\x9d lists I\xe2\x80\x99ve had'
你会注意到你展示的内容中有3组奇怪的字符。这些对应于repr中的3组\xhh
。
第一组(\xe2\x80\x9c
)解码后是U+201C,表示左双引号。
第二组是\xe2\x80\x9d
。注意到只有前两个“拉丁特殊字符”,也就是“奇怪的字符”在你的显示中出现了。这是因为你的终端编码是cp1252
,它不支持\x9d,所以直接忽略了它。Unicode是U+201D,表示右双引号。
第三组变成了U+2019,表示右单引号(用作撇号)。
因为你有UTF-8编码的字节,所以在使用PostgreSQL时应该不会有问题。如果你遇到错误,展示一下你的代码、完整的错误信息和完整的追踪记录。
如果你真的需要在Windows终端显示这些奇怪的字符,可以用 print guff.decode('utf8').encode('cp1252')
... 但要做好准备,因为有些Unicode字符在cp1252
中是不支持的。
更新 针对评论 我在保存数据时没有问题,问题是在显示时出现了奇怪的字符,所以我想在保存之前转换这些数据,我这样做对吗?
你得想清楚。 (1) 在你的问题中你说“我在PostgreSQL中保存utf-16字符时遇到问题”。 (2) 现在你说“我在保存数据时没有问题,问题是在显示时出现了奇怪的字符”。
总结:你的示例数据是用UTF-8编码的。如果PostgreSQL不接受UTF-8,可以解码成Unicode。如果你遇到显示问题,首先尝试显示对应的Unicode;如果那样不行,试试你的终端支持的编码(大概是cp125X
系列中的一种)。