将UTF-16特殊字符转换为UTF-8

-1 投票
2 回答
2856 浏览
提问于 2025-04-17 12:10

我在使用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 个回答

-1

这个方法对我有效,可以用来转换字符串:sample_data.decode('mbcs').encode('utf-8')

1

其实并没有什么“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系列中的一种)。

撰写回答