将Python字符编码转换为UTF-8

7

实际数据:CN=usernameOU=CompanyNameDC=companyDC=intra(在MySQL数据库中的显示方式),当我获取这些数据时,它在Python变量中的显示方式如下(从MySQL检索):CN=usernameOU=CompanyNameDC=companyDC=intra

当我尝试这样做时;

truestr = unicode(str,'utf-8');

出现异常信息:

'ascii'编码无法解码位于位置4的0xC4字节:范围超出128。

我该如何解决这个问题?(我使用的是Python 2.6)


str 变量的实际值是什么?请更新您的问题。 - mertyildiran
在MySQL中,我看到字符串CN=Uğur ... 当我在Python中选择并提取它到str变量中时,它似乎是CN=UÄŸur ... - user4005632
你需要更新你的问题,展示给我们如何填充 str。请使用 [编辑] 链接。 - tripleee
4个回答

4

你可以通过以下方法检查编码:

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>> 

如果编码为ascii,则设置为utf-8 步骤如下(使用Python 2.7):
1. 打开以下文件: /usr/lib/python2.7/sitecustomize.py
2. 将以下内容更新为utf-8: sys.setdefaultencoding("utf-8")
[编辑2] 请在代码开头添加以下内容并检查:
>>> try:
...     import apport_python_hook
... except ImportError:
...     pass
... else:
...     apport_python_hook.install()
... 
>>> import sys
>>> 
>>> sys.setdefaultencoding("utf-8")
>>> 
>>>

在 /usr/lib/python2.6 中没有像 sitecustomize.py 这样的文件,但是在 site-packages 中也没有。 - user4005632
1
@MehmetYenerYILMAZ:嗨,你能在你的代码中添加sys.setdefaultencoding("utf-8")吗,就像上面提到的那样。 - Vivek Sable
我看到你的答案可以解决我的问题,但是出现了一个异常:“module”对象没有“setdefaultencoding”属性。 - user4005632
@MehmetYenerYILMAZ:你只写 sys.setdefaultencoding("utf-8") 就会显示异常... 我们还必须编写 try and except 块。 - Vivek Sable

1
这个错误意味着你的消息已经是一个 `unicode` 对象,不需要解码。请注意,当您进行以下操作时:
truestr = unicode(string, 'utf-8')

你的变量string首先会被隐式转换为str类型,使用默认的'ascii'编解码方式。当然,这会失败,因为你的字符串包含非ASCII字符。
如果你想将string以UTF-8格式写入某个地方,请使用string.encode('utf-8')
注意:由于与内置的str类型名称冲突,我已将您的str变量重命名为string。将变量命名为str(或intfloat等)是非常糟糕的风格。

name = cursor.fetchall()[0]["NAME"] name_ = name.encode('utf-8') 异常:'ascii' codec无法解码位置4的字节0xc4:序数不在范围内(128) - user4005632
1
阅读有关Python中Unicode的一些文档:1. https://docs.python.org/2/howto/unicode.html 2. http://farmdev.com/talks/unicode/ - alexanderlukanin13

1

前往此文件

vi /usr/lib/python2.7/site-packages/sitecustomize.py

添加这段文字。
import sys

reload(sys)

sys.setdefaultencoding("utf-8")

1
重新加载的意思是什么? - Vivek Sable
1
不,这是一个非常糟糕的想法。你最终会编写无法在其他任何机器上运行并掩盖各种问题的代码。在建议之前,请仔细理解它。 - Alastair McCormack

0

您的系统默认编码为ASCII。使用"sys.setdefaultencoding"将其切换为utf-8编码。此函数仅在Python扫描环境时启动时可用。要使用此函数,您必须在导入模块后重新加载sys。以下是解决问题的代码。

import sys
reload(sys)
sys.setdefaultencoding ("utf-8")

编辑:

如果您想使用 utf-8 编码,请在代码的开头使用它。如果您在代码中间使用它,那么它将会与已经加载的 ASCII 数据产生问题。


3
这应该是一条评论,而不是答案。一旦您在此网站上获得了一些声望,这些事情将会更容易。在那之前,请稍微克制一下。 - tripleee
谢谢。我会记住的,但目前我没有足够的声望来发表评论。 - Ismail Zafar
1
没错。这就是为什么我建议你先保持住,直到你获得了一些声望。 - tripleee
不,你不应该建议这种恶劣的黑客。它掩盖了许多问题,意味着使用它编写的任何代码都变得非常脆弱。 - Alastair McCormack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接