我正在使用python-memcached库检索由memcached中的另一个应用程序设置的值。但不幸的是,这是我得到的价值:
>>> mc.get("key")
'\x04\x08"\nHello'
是否可以使用python函数将此混合ASCII代码解析为纯字符串?
感谢您的帮助
答案 0 :(得分:7)
是“普通字符串”,只要存在这种情况。我不知道你期望什么样的输出,但是:
没有纯文字。
Python(在2.x中,无论如何)str
类型实际上是字节的容器,而不是字符。所以它首先不是真正的文本:)它显示假设一个非常简单的编码的字节,使用转义序列来表示甚至有点“怪异”的每个字节。如果你print
字符串(你现在看到的是在你的代码中创建这样一个文字字符串的语法),它将被再次格式化。
在更简单的时间里,我们天真地认为我们可以将字节映射到这些符号,我们称之为“字符”,就是这样。然后事实证明,人们想要使用大约数十亿种不同的映射,并且其中许多映射需要的字符数比字节所能表示的要多。这就是我们现在拥有Unicode的原因:它代表了您可以想象的任何现实世界语言所需的每个符号(以及几种用于假语言和其他目的),它抽象地为这些符号分配数字,但不说如何收集和解释字节为数字。 (这是编码的目的)。
如果您知道字符串数据是以特定方式编码的,则可以将其解码为Unicode字符串。它可以是实际Unicode数据的编码,也可以是其他格式(例如,日语文本经常出现在名为“Shift-JIS”的内容中,因为它与“Latin-JIS”具有大致相同的意义。 1“ - ASCII的常见扩展 - 对我们有用。无论哪种方式,您都可以获得一系列Unicode代码点的内存表示(前一段中提到的数字)。出于所有意图和目的,这实际上是“文本”,但它并非真正“简单”:)
但看起来你拥有的数据实际上是一个字节的二进制blob,只有发生主要由“可读文本”组成,如果解释为ASCII。
你真正需要做的是找出为什么第一个字节的值为4,下一个字节的值为8,然后相应地继续。
答案 1 :(得分:1)
如果你只需要修剪'\x04\x08"\n'
,它总是一样的(你没有非常清楚地提出你的问题,我不确定它是什么或你想要的是什么),做点什么像这样:
to_trim = '\x04\x08"\n'
string = mc.get('key')
if string.startswith(to_trim):
string = string[len(to_trim):]