【问题标题】:Unicode handling in python 2python 2中的Unicode处理
【发布时间】:2016-06-08 19:10:00
【问题描述】:
>>> cmd="echo ö"
>>> type(s1)
<str>
>>> print s1
echo ö
>>> chan.exec_command(cmd)

我从外部应用程序中得到一个带有一些 unicode 字符的字符串。我应该如何在我的 python 代码中正确处理这个字符串?当我将其发送到 paramiko exec_command 方法时,我收到如下异常。这里chan 是我的 Paramiko 对象。

'ascii' 编解码器无法对位置 136 中的字符 u'\xfc' 进行编码:序数 不在范围内(128)

在将它发送到 paramiko 之前,我需要对这个字符串进行编码/解码。我是 python 新手,任何帮助将不胜感激。 这是我要添加的字符串:

X0A3549029:[u'Uni\xf3n de Cr\xe9', u'DemoModel', 'NA']
Traceback (most recent call last):
  File "updateTelemetry.py", line 98, in <module>
    query="insert into record_tmp(sn,cname,model,product) values('"+key+"','"+value[0].decode('utf8')+"','"+value[1]+"','"+value[2]+"')"
  File "/usr/lib64/python2.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
 UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 3: ordinal not in range(128)

【问题讨论】:

  • 您的示例是一个可以是任何编码的字节字符串。字节字符串不会返回 can't encode 错误消息,因为它们已经被编码。产生该错误的 actual 字符串和数据类型是什么?请发帖MCVE
  • 好吧,你需要放慢脚步,学习一下 Python 2 中的 Unicode。在这里查看我的快速总结:stackoverflow.com/questions/21129020/…。您粘贴的堆栈跟踪似乎与顶部的代码行没有相似之处。最好的办法是结束这个问题并提出一个新的问题,其中包含完整的源、输入和给定的堆栈跟踪。

标签: python python-2.7 unicode paramiko python-unicode


【解决方案1】:

使用.decode('utf8')转成unicode类型:

>>> cmd="echo ö"
>>> type(cmd)
<type 'str'>
>>> cmd_unicode=cmd.decode('utf8')
>>> type(cmd_unicode)
<type 'unicode'>

PS:Unicode 处理在 Python 2 和 3 之间有所不同。

【讨论】:

  • 这不适用于 python 2.7。获取 UnicodeDecodeError:无效的起始字节
  • 在 Ubunutu 64Bit 16.04 上的 Python 2.7.11+ 上测试。您是否测试过我给定的示例,或者您是否在您的代码上尝试过?
  • 仅测试了您的示例。在windows上测试时,它没有工作。然而,在 CentOS 上测试时,它工作了 :)
  • cmd_unicode=cmd.decode('utf8') 仅在 cmdutf-8 编码时有效。在 Windows 上的交互式会话中,它将被编码页码。在 Unix 机器上,它将被编码为您的终端模拟器配置的任何内容。基本上,你不能对编码做出任何保证,你应该使用更强大的方法来解决它
【解决方案2】:

UnicodeEncodeError 在 Python 2 上调用 .decode() 时表示输入是 Unicode,因此 Python 尝试编码它首先使用 sys.getdefaultencoding() 在 Python 2 上应该是 ASCII,然后再将其传递给.decode() 方法。

放弃.decode('utf8') 呼叫—value[0] 已经是 Unicode。


不相关:不要使用字符串格式,创建 sql 查询——使用参数化的 sql 查询:

db.execute("insert into record_tmp(sn,cname,model,product) values(?,?,?,?)",
           [key] + values)

占位符语法可能因您使用的 Python db-api 模块而异,例如,它可能是 %s 而不是 ?

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2010-09-08
    相关资源
    最近更新 更多