python - 用python编码unicode
问题描述
我试图了解编码 unicode 在 python2.7 中的工作原理,到目前为止很容易找到解决方案,但我还没有找到任何明确的解释,因为这里发生了什么。这是一个例子。
简介
我们收到了一个 unicode 变量,称为filter_type
filter_type = u'some_välüe'
。
我们将它放入一个 dict 并将其传递到python 库 urllib.urlencode。
像这样:
urllib.urlencode({"param:" ..., "filter_type": filter_type}
这个问题。
在urllib.urlencode
它内部循环提供给它的数据并将键和值包装到str()
内置函数中,以在将每个键和值编码为 url 之前获取每个键和值的字符串表示形式。
我们收到类似于以下内容的错误:
{UnicodeEncodeError}'ascii' codec can't encode character u'\xf1' in position 42: ordinal not in range(128)
.
你会得到同样的错误str(u'some_välüe')
。
因此,经过一些研究和深入研究后,看起来当您将 unicode 值包装在其中时,str()
它会尝试将值编码为设置的默认编码。(我的假设)
>>> import sys
>>> sys.getdefaultencoding()
ascii
解决方案。
所以我们可以通过使用utf-8对这些 unicode 字符串进行编码来解决这个问题。
filter_type = u'some_välüe'.encode('utf-8')
.
这个问题。
但问题来了。在我提到urllib.urlencode
将键和值包装到str()
函数中之前。
这些值现在已经编码,所以..
- str() 现在在这种情况下做了什么?
- unicode 对象的表示在编码为utf-8时会发生变化吗?
- 如果确实如此,为什么首先
str()
尝试将 unicode 对象编码为 ascii(默认)。
解决方案
推荐阅读
- scala - Spark Structured Streaming 从 kafka 读取不同的事件类型
- one-time-password - 身份验证器无法从密码中解析代码
- c - char *ptr = "hi"; 有什么区别?int *ptr = "100"?
- tensorflow - 我可以找到训练 tensorflow 预训练模型的类名吗?
- javascript - Alexa Node.js 意图问题
- security - 用于下载所有 CA 证书的 API 或任何来源
- javascript - 暂停广告系列基于:广告系列名称、广告组名称、预算和日期范围
- go - Hyperledger Fabric,golang中的嵌套结果迭代器 - 如何?链码启动失败
- c++ - C++ 原子栅栏和重新排序
- redis - 数据发布到redis时没有调用@SubscribeMessage('events')