python – str和unicode之间的区别:为什么Redis在传递unicode时会返回二进制数据?

python – str和unicode之间的区别:为什么Redis在传递unicode时会返回二进制数据?,第1张

概述关于数据类型str和unicode之间的区别,在 two questions之后,我仍然对以下内容感到困惑. 在第1区,我们看到城市的类型是unicode,正如我们所期望的那样. 然而在块2中,在通过磁盘往返(redis)之后,城市的类型是str(并且表示是不同的). 将utf-8存储在磁盘上,读入unicode,然后用utf-8写回的dogma在某处失败了. 为什么类型(城市)的第二个实例是st 关于数据类型str和unicode之间的区别,在 two questions之后,我仍然对以下内容感到困惑.

在第1区,我们看到城市的类型是unicode,正如我们所期望的那样.

然而在块2中,在通过磁盘往返(redis)之后,城市的类型是str(并且表示是不同的).

将utf-8存储在磁盘上,读入unicode,然后用utf-8写回的dogma在某处失败了.

为什么类型(城市)的第二个实例是str而不是unicode?

同样重要的是,这有关系吗?您是否关心您的变量是unicode还是str,或者只要代码“做正确的事情”,您是否忘记了差异?

# -*- Coding: utf-8 -*-# Block 1city = u'Düsseldorf'print city,type(city),repr(city)# Düsseldorf <type 'unicode'> u'D\xfCSSeldorf'# Block 2import redisr_server = redis.Redis('localhost')r_server.set('city',city)city = r_server.get('city')print city,repr(city)# Düsseldorf <type 'str'> 'D\xc3\xbCSSeldorf'
解决方法 教条?

为什么使用字符集和编码并不是教条主义 – 这是必要的.
希望您已经阅读了足以理解为什么我们使用了这么多字符集. Unicode显然是前进的方向(映射了所有字符),但是如何将Unicode字符从一台机器传输到另一台机器,或者将其保存到磁盘?

我们可以使用Unicode点值,但由于Unicode点实际上是32位,因此需要将每个字符保存/传输为整个32位(也称为UTF-32). a将被编码为0x00000061 – 这是一个字符的浪费位.在处理大多数ASCII时,UTF-16的浪费要少一些,但UTF-8是使用最少量位的最佳折衷方案.

在代码中使用解码的Unicode显然使开发人员不必考虑编码的复杂性,例如字符数等于多少字节.

解决方案

Redis客户端

正如@ J.F.Sebastian所建议的那样,redis-py驱动程序在Redis和Connection类上包含decode_responses选项.设置为True时,客户端将使用enCoding选项解码响应.默认编码= utf-8.

例如.

r_server = redis.Redis('localhost',decode_responses=True)city = r_server.get('city')# city = <type 'unicode'>

包装类

自发现decode_responses以来不再需要.

似乎Redis驱动程序相当简单 – 如果你发送一个Unicode,它会将它转换为默认编码(大多数情况下是UTF-8).在响应时,Redis不知道编码,因此返回一个str,以便您根据需要进行解码.

因此,如果在发送到Redis之前将字符串编码为UTF-8并在响应时解码为UTF-8会更安全.其他DB驱动程序更高级,因此接收和返回Unicodes.

但是,当然,您不应该使用.encode()和.decode()来编写代码.常见的方法是形成“Unicode三明治”,以便外部数据在输入时解码为Unicode并在输出上进行编码.那么这对你有什么用呢?包装Redis驱动程序,使其返回您想要的内容,从而将解码推回到代码的外围.

例如,它应该像下面这样简单:

class UnicodeRedis(redis.Redis):    def __init__(self,*args,**kwargs):        if "enCoding" in kwargs:            self.enCoding = kwargs["enCoding"]        else:            self.enCoding = "utf-8"        super(UnicodeRedis,self).__init__(*args,**kwargs)    def get(self,**kwargs):        result = super(UnicodeRedis,self).get(*args,**kwargs)        if isinstance(result,str):            return result.decode(self.enCoding)        else:            return result

然后,您可以正常与它进行交互,除了您可以传递一个更改字符串解码方式的编码参数.如果您未设置编码,则此代码将采用utf-8.

例如.

r_server = UnicodeRedis('localhost')city = r_server.get('city')
总结

以上是内存溢出为你收集整理的python – str和unicode之间的区别:为什么Redis在传递unicode时会返回二进制数据?全部内容,希望文章能够帮你解决python – str和unicode之间的区别:为什么Redis在传递unicode时会返回二进制数据?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1194251.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存